Java反射
2018-09-03 本文已影响0人
Gandalf_108
一. Class类
类就是对象,类是java.lang.Class类的实例对象
万事万物皆是对象,
类也是对象,是Class类的实例对象
这个对象我们称为该类的类类型
There is a class named Class
//第一种表达方式 任何一个类都有一个隐含的静态成员变量Class
Class c1 = Foo.class
//第二种表达方式 已经知道该类的对象通过getClass方法
Class c2 = foo1.getClass();
/*官网 c1,c2表示了Foo类的类类型(class type)*/
//不管c1 or c2都代表了Foo类的类类型,一个类只可能是Class类的一个实例对象
System.out.println(c1 == c2);
//第三种表达方式
Class c3=null;
c3=Class.forName("com.imooc.reflect.Foo");
//我们完全可以通过类的类类型创建类的对象实例--->通过c1 or c2 or c3创建Foo的实例对象
Foo foo=(Foo)c1.newInstance();//需要有无参数的构造方法
二. Java动态加载类
1) 静态加载类,是编译时刻加载;动态加载类,是运行时刻加载
2) new创建对象,是静态加载类,在编译时刻就需要加载所有的"可能使用到的类"。有一个类可能有问题(如不存在),都不能通过编译,会报错。
3) Class.forName("类的全称") 通过动态加载类,可以用到一个类时,才进行加载。
【功能性的类尽量使用动态加载,并对新添加的类实现功能性接口(标准),这样就不用重新编译】
Class c = Class.forName(args[0]) 动态加载类
Office oa = (Office)c.newInstance();
使用子类实现这个接口,编译时javac office word即可
三. Java获取方法信息
基本数据类型,void关键字都存在类类型
class.getMethods()方法获取是该类的所有public方法,包括从父类继承的方法;
class.getDeclareMethods()方法获取该类自行声明的所有方法,不论访问权限;
method.getName()获取方法名
method.getReturnType()获取方法的返回值
method.getParameterTypes(),获取方法的参数类型的类类型数组class[]
Class c1 = int.class; int的类类型
Class c2 = String.class; String类的类类型 String类字节码
Class c3 = double.class; double这个数据类类型的字节码表示方式
Class c4 = Double.class; Double这个类的类类型字节码表示方式
Class c5 = void.class; 表达了void这个类的类类型
getName为这个类的类类型的具体名称
c1.getName ---> int
c2.getName ---> java.lang.String 类的全称
c2.getSimpleName ---> String 不包含包名的类的名称
四. Java方法反射的基本操作
1.获取A类中的print(int,int)方法:
①要获取一个方法就是获取类的信息,获取类的信息首先要获取类的类类型
A a1=new A();
Class c= a1.getClass();
②获取方法 由名称和参数列表来决定
getMethod获取的是public方法,
getDelcaredMethod获取自己声明的方法
Method m =c.getMethod(methodName,paramtypes); //paramtypes可以用数组的形式 表示new Class[]{int.class,int.class},也可以直接列举类类型
2.方法的反射操作:是用m对象来进行方法调用,和a1.print(10,20)调用的方法相同 m.invoke(a1,new Object[]{10,20})
Object o=m.invoke(对象名,参数);//方法如果没有返回值返回null,如果有返回值返回具体值,参数可用数组的方式表示,也可以直接列举,没有参数就不写。