黑马程序员技术交流社区
标题:
反射:就是通过class文件对象
[打印本页]
作者:
122125241
时间:
2015-7-5 22:37
标题:
反射:就是通过class文件对象
反射:就是通过class文件对象,去使用该文件中的成员变量,构造方法,成员方法。
* 要想使用,必须得到class文件对象,其实也就是得到Class类的对象。(所有的.class文件都是这个类的对象)
* Class类:
* 成员变量 Field
* 构造方法 Constructor
* 成员方法 Method
* 通过Class类获得者三个类,再通过这三个类的对象调用该类的方法
* 获取class文件对象的方式:
* A:Object类的getClass()方法
* B:数据类型的静态属性class
* C:Class类中的静态方法
public static Class forName(String className)
反射的调用方法,成员的举例
package it.cast;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
/*
* 类加载器是专门加载类而存在的
* 根类加载器 扩展类加载器 系统类加载器
* 虚拟机调用根类加载器和扩展类加载器.在我们运行自己写的系统类加载器时
* 反射:
* */
public class Demo {
/**
* @param args
*/
public static void main(String[] args) throws Exception {
// 三种方法创建类自解码文件对象
Class<? extends Student> c2 = new Student().getClass();
Class<?> c1 = Class.forName("it.cast.Student");
Class<?> c = Student.class;
System.out.println("--------------------------------------");
// 获取该类公共的单个构造方法与多个构造方法
Constructor<?> constructor2 = c.getConstructor();
Constructor<?>[] constructors = c.getConstructors();
// 获取该类所有的单个构造方法或者多个构造方法
Constructor<?> declaredConstructor = c.getDeclaredConstructor();
Constructor<?>[] declaredConstructors = c.getDeclaredConstructors();
System.out.println("--------------------------------------");
// 通过任意一个构造方法创造对象实例化
Object newInstance = constructor2.newInstance();
System.out.println("--------------------------------------");
// 获取该类的公共的多个成员变量
Field[] fields = c.getFields();
// 获取该类所有的成员变量
// c.getDeclaredField(name);
Field[] declaredFields = c.getDeclaredFields();
// 获取单个成员变量的对象并赋值
// 公共的变量直接赋值
Field field = c.getField("a");
//念法(给newInstance对象的field成员变量赋值为22)
field.set(newInstance, 22);
// 私有变量赋值
Field field2 = c.getDeclaredField("name");
field2.setAccessible(true);
field2.set(newInstance, "张三");
Field field3 = c.getDeclaredField("age");
field3.setAccessible(true);
field3.set(newInstance, 32);
System.out.println("--------------------------------------");
//获取所有的方法
Method[] methods = c.getMethods();//这个获取自己的和父类的所有方法
Method[] methods2 = c.getDeclaredMethods();//获取自己的方法
for (Method method : methods2) {
System.out.println(method);
}
//获取单个方法并调用
Method method = c.getMethod("setAge",int.class);
method.setAccessible(true);
method.invoke(newInstance, 200);
System.out.println(newInstance);
}
}
复制代码
作者:
3253637854
时间:
2015-7-6 15:50
赞赞赞赞赞赞赞,,,
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2