首页 > 代码库 > java学习第25天(反射)

java学习第25天(反射)

      今天主要是学习了一个非常重要的知识,反射。我的理解是我们之前是通过加载class文件然后初始化,最后执行。也就是说当程序要使用某个类时,如果该类还未被加载到内存中,则系统会通过加载,连接,初始化三步来实现对这个类进行初始化。 而什么是反射呢,我简单的理解就是,通过class文件来获取一个类的成员变量 方法等信息。

       有三种方法去获取字节码文件。

第一种  使用类的对象+.getclass() 

Person p = new Person();
Class c = p.getClass();

第二种 直接用类+.getclass() 
Class c3 = Person.class;

第三种  使用Class调用方法(需要给出的是类的路径)
Class c4 = Class.forName("cn.itcast_01.Person");

一般来说我们用第三种,我们如果将forName中的路径使用读取文件的形式,那么我们只要规定不同的路径在文件中那么我们就可以读取不同的类。

然后主要是如何使用反射获取构造方法 成员变量 成员方法。 

// 获取字节码文件对象
Class c = Class.forName("cn.itcast_01.Person");

// 获取构造方法
// public Constructor[] getConstructors():所有公共构造方法
// public Constructor[] getDeclaredConstructors():所有构造方法
// Constructor[] cons = c.getDeclaredConstructors();
// for (Constructor con : cons) {
// System.out.println(con);
// }

// 获取单个构造方法
// public Constructor<T> getConstructor(Class<?>... parameterTypes)
// 参数表示的是:你要获取的构造方法的构造参数个数及数据类型的class字节码文件对象
Constructor con = c.getConstructor();// 返回的是构造方法对象

// 使用此 Constructor 对象表示的构造方法来创建该构造方法的声明类的新实例,并用指定的初始化参数初始化该实例。
Object obj = con.newInstance();
System.out.println(obj);

// 通过带参构造方法对象创建对象

Constructor con = c.getConstructor(String.class, int.class,String.class);


// public T newInstance(Object... initargs)
Object obj = con.newInstance("111", 22, "333");
System.out.println(obj);

 

// 获取所有的成员变量
// Field[] fields = c.getFields();
// Field[] fields = c.getDeclaredFields();
// for (Field field : fields) {
// System.out.println(field);
// }

/*
* Person p = new Person(); p.address = "北京"; System.out.println(p);
*/

// 通过无参构造方法创建对象
Constructor con = c.getConstructor();
Object obj = con.newInstance();
System.out.println(obj);

// 获取单个的成员变量
// 获取address并对其赋值
Field addressField = c.getField("address");
// public void set(Object obj,Object value)
// 将指定对象变量上此 Field 对象表示的字段设置为指定的新值。
addressField.set(obj, "北京"); // 给obj对象的addressField字段设置值为"北京"
System.out.println(obj);

 

// 获取所有的方法
// Method[] methods = c.getMethods(); // 获取自己的包括父亲的公共方法
// Method[] methods = c.getDeclaredMethods(); // 获取自己的所有的方法
// for (Method method : methods) {
// System.out.println(method);
// }

Constructor con = c.getConstructor();
Object obj = con.newInstance();

// 获取单个方法并使用
// public void show()
// public Method getMethod(String name,Class<?>... parameterTypes)
// 第一个参数表示的方法名,第二个参数表示的是方法的参数的class类型
Method m1 = c.getMethod("show");
// public Object invoke(Object obj,Object... args)
// 返回值是Object接收,第一个参数表示对象是谁,第二参数表示调用该方法的实际参数
m1.invoke(obj); // 调用obj对象的m1方法

System.out.println("----------");
// public void method(String s)
Method m2 = c.getMethod("method", String.class);
m2.invoke(obj, "hello");

 

java学习第25天(反射)