java反射机制给我们在开发中带来了很多的便利,下面是我在imooc上看到的一些知识点的总结,第一个代码:
package com.tiger.reflect;
public class ExampleOne {
public static void main(String[] args) {
//方法1:当已知类的名称的时候,可以直接获得其实例
Class model1=Model.class;
//方法2:当已知一个该类的对象的时候
Class model2=model1.getClass();
System.out.println(model1==model2);
//方法3:当已知该类的一个实例的时候,使用该方法也可以直接获取该类的一个实例
Class model3=null;
try {
model3=Class.forName("com.tiger.reflect.Model");
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("不管是哪种方式获得的类的实例,他们其实都是类类型(class type)的表现"
+"一个类仅仅是java.lang.Class的对象,它不可能有两种类型,所以获得的只是同一个实例:");
System.out.println("model1==model2?"+(model1==model2));
System.out.println("model1==model3?"+(model2==model3));
}
}
class Model {}
2、我们在编写java代码的时候一般会经过先编译,再运行的过程,但是这就会导致一个问题,那就是使用new 方式只能够静态的加载,这样就会有一个弊端,那就是假如说我有N个类,但是中间只有一个是错误的,或者说没有这个类,那么采用new方式就不能编译通过,那么我所有的类都将不能正常的使用,这就不好了。所以可以采用反射机制,进行动态的加载我们所需要的类,这样就不会出现我们遇到这种情况了。那就是Class c=Class.forName(“类的全名”);然后进行强制的类型(前提是这个类型是我们要用的类的implements的共同遵守的一个标准,这也为今后的功能添加,子类添加奠定了基础)转换即可。
3、对于成员变量,其实它(们)也是对象,万事万物在java中全是对象,至于成员变量就是Field的对象,我们可以使用
Class c=c.class;
Field[] fields=c.getDeclaredFields();
field.getName(),field.getType();
就可以了。
4、对于成员函数,其实它也是对象。我们可以使用
Class c=obj,getClass();
c.getDeclaredMethods();
5、小总结:只要想获取类信息,就要获得类类型如,Class c=object.getClass();
6、方法的获得:思路就是,要是获得某个方法的具体的信息,就要先获取该方法所在的类的类类型,然后使用method.invoke,由此可以获得方法的具体信息了。
Class c=object.getClass();
c.getMethod(name,params);//只是public 方法,也可以使用getDeclaredMethods();
例如,我们有一个叫print的方法,里面有两个int int参数,
就可以如下写:Method method=c.getDeclaredMethods(“print”,new Class[]{int.class,int.class});
或者:
method=c.getDeclaredMethods(“print”,int.class,int.class);//有几个参数就写几个参数,这样也是可以的。
方法反射调用函数的方式就是使用method来进行操作的
当有返回值的时候,Object object=method.invoke(obj,params);//效果和obj.print(10,12);效果是一样的。没有返回值时,返回null;
其中参数obj就是我们要反射的类的实例,是不是并不是那么难啊。
最后一个知识点就是反射操作和泛型的操作是绕过编译阶段的。