您的位置:首页 > 编程语言 > Java开发

JAVA基础_反射

2018-03-05 17:36 369 查看
Class类的使用
类是对象,类是java.lang.Class类的实例对象。如何表示Class类的实例呢?任何一个类都是Class类的实例对象,这个实例对象有三种表示方式:
创建一个类class Foo{
}第一种表达方式-->实际在告诉我们任何一个类都有一个隐含的静态成员classClass c1 = Foo.class;
第二种表达方式。已经知道该类的对象通过getClass方法。Foo foo1 = new Foo();Class c2 = foo1.getClass();
官网c1,c2表示了Foo类的类类型(class type)万事万物皆对象,类也是对象,是Class类的实例对象,这个对象我们成为该类的类类型
不管c1 or c2都代表了Foo类的类类型,一个类只可能是Class类的一个实例对象。
第三种表达方式  //会有异常Class c3 = null;c3 = Class.forName("包名.类名");
我们完全可以通过类的类类型创建该类的对象实例-->前提要求是需要有无参数的构造方法。通过c1 or c2 or c3创建Foo的实例对象Foo foo = (Foo)c1.newInstance()//会有异常

动态加载类:Class.forName("类的全称");不仅表示了类的类型,还表示了动态加载类编译时刻加载类是静态加载类,运行时刻加载类是动态加载类代码:class Office{ public static void main(String[] args){ if("word".equals(args[0])){ word w = new word(); w.start(); } }}当编译以上代码会出现错误,因为没有word和Excle这两个类,当创建成功word类后,还是有错误,因为Excle任然是不存在的。我们的目的是,用到什么类加载什么类,我们希望运行时加载。new创建对象,是静态加载类,在比哪一时刻就需要加载所有可能使用到的类。
通过动态加载类可以解决该问题。class Office{ public static void main(String[] args) throws Exception{ //动态加载类,在运行时刻加载 Class c = Class.forName(args[0]); //通过类类型,创建该类对象 //此中类名是word和Excle的接口或父类。多态 类名  变量名 = (类名)c.newInstance(); }}
Class类的一些基本方法:public String getName()以 String 的形式返回此 Class 对象所表示的实体(类、接口、数组类、基本类型或 void)名称。public String getSimpleName()返回源代码中给出的底层类的简称。public Method[] getMethods()throws SecurityException返回一个包含某些 Method 对象的数组,这些对象反映此 Class 对象所表示的类或接口的公共 member 方法getRunType();//得到方法的返回值类型的类类型public Method[] getDeclaredMethods() throws SecurityException返回 Method 对象的一个数组,这些对象反映此 Class 对象表示的类或接口声明的所有方法,

获取成员变量的一些信息:成员变量也是对象java.labg.reflect.FieldField类封装了关于成员变量的操作getFields()方法获取的是所有的public的成员变量的信息getDeclaredFields获取的是该类自己声明的成员变量的信息Field[] fs = c.getFields();getType()方法获取的是成员变量的类型的类类型
获取构造方法的信息:构造函数也是对象;java.lang.Constructor中封装了构造函数的信息c.getConstructor()//获得所有的public的构造方法getDeclaredConstructor()//得到所有的构造函数
获得构造函数的参数列表的类类型constructors.getParameterTypes();
方法的反射操作:1、如何获取某个方法:方法的名称和参数列表才能唯一决定某个方法getMethod()获取的是public的方法getDelcaredMethod()获取的是自己声明的方法2、方法的反射操作:是指用m对象来进行方法调用方法如果没有返回值返回null,有返回值返回具体的返回值m.invoke(操作方法的对象,new Object[]{参数列表});m.invoke(操作方法的对象,参数列表);
21.反射之修改成员属性格式:1.创建对象2.获取类名.class对象3.用,public class Test3 {public static void main(String[] args) throws Exception {A c = new A("kb kb kb ");Class<?> c= A.class;或:Class c = Class.forName("A");Field f = A.class.getDeclaredField("a");System.out.println(c.a);f.set(c, "fuck");System.out.println(c.a);}}class A{String a;A(String a){this.a=a;} 22,反射之获取构造方法1.当只需要获得无参构造成的对象时String name = "cn.itcast.bean.Person";//找寻该名称类文件,并加载进内存,并产生Class对象。Class clazz = Class.forName(name);//如何产生该类的对象呢?Object obj  = clazz.newInstance();2.当想获取有参构造的对象.String name = "cn.itcast.bean.Person";//找寻该名称类文件,并加载进内存,并产生Class对象。Class clazz = Class.forName(name);//获取到了指定的构造函数对象。Constructor constructor = clazz.getConstructor(String.class,int.class);(这里传构造方法参数类型的字节码对象)//通过该构造器对象的newInstance方法进行对象的初始化。Object obj = constructor.newInstance("小明",38);(直接传构造方法参数)Constructor[] constructor = clazz.getConstructors();这是获取包含所有按由上至下的构造方法的,一个数组23,反射之获取成员方法Class clazz = Class.forName("cn.itcast.bean.Person");Method method = clazz.getMethod("paramMethod", String.class,int.class);//参数(方法名,方法参数1的字节码对象1,方法参数2的字节码对象)Object obj = clazz.newInstance();method.invoke(obj, "小强",89);(本类对象,方法参数1,方法参数二)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: