java基础(jdk1.8)
**
反射
**
JAVA反射机制是在运行状态中,对于任意一个类,都能知道这个类的所有属性和方法
对于任意一个对象,都能调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。
常用于在不改变原有代码基础上增加功能
/**
* 加载器加载类后会有一个类对象
* 拿到这个类的文件对象(反射)
* 然后用这个对象实现功能的增加
*/
获取文件对象
1.对象获取
Demo d = new Demo();
Class c = d.getClass();
//c为class文件对象
2.类名获取
Class c = Demo.class;
//c为class文件对象
3.Class类静态方法获取
Class c = Class.forName("package.Demo");//包名.类名
//c为class文件对象
三者获取的class文件对象相等
运行构造方法
1.获取class文件对象
2.从class文件对象中,获取构造方法
Class c = Class.forName("package.Demo");//包名.类名
//获得所有公共构造方法
Constructor[] cons = c.getConstructors();
//获取指定构造方法(传参则获取指定构造方法,无参为无参构造)
Constructor con = c.getConstructor();
Constructor con1 = c.getConstructor(int.class);
//运行构造方法
Object o = con.newInstance();
Object o1 = con.newInstance(1);
//使用泛型可直接获取需要类的类对象
扩展:
如果被反射的类具有 空参构造方法 并且为public,即可如下操作
Class c = Class.forName("package.Demo");
Object object = c.newInstance();
注意:
以上只能执行public修饰的构造方法
执行private修饰则应该使用getDeclaredConstructor()方法(暴力反射)
成员变量
1.获取class文件对象
2.从class文件对象中,获取成员变量
Class c = Class.forName("package.Demo");//包名.类名
//获取所有公共成员变量
Field[] fields = c.getFields();
//获取指定成员变量(id)
Field id = c.getField("id");
//修改参数值
Object obj = c.newInstance();
id.set(obj,2);//需要传入指定类(无泛型则Object)
同样private修饰应该使用Declared
方法
1.获取class文件对象
2.从class文件对象中,获取方法
Class c = Class.forName("package.Demo");//包名.类名
//获取所有public方法
Method[] methods = c.getMethods();
//获取指定方法
Method method = c.getMethod("eat");
Method method1 = c.getMethod("eat", int.class);
//运行方法
Object obj = c.newInstance();
method.invoke(obj);
method1.invoke(obj,1);
上一篇 》类加载过程
下一篇 》Java集合