反射深入理解
反射就是把我们写的普通Java类中的各种成分映射成对应的Java类。如普通的Java类都有方法,构造方法和字段等成分
package com.guoyasoft;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import com.guoyasoft.implement.Student;
//反射就是把我们写的普通Java类中的各种成分映射成对应的Java类
public class ReflectMethon {
public static void main(String[] args) throws Exception {
// // 1、获取class对象,class包含:packageName 字段:field 方法:mathon 加载器:constructor
//方法一:类名.class
// Class c1 = StudentWL.class;
// 方法二:先new一个实例,再实例变量名.getClass()
// StudentWL s = new StudentWL();
// Class c2 = s.getClass();
// 创新点:允许启动程序的时候,可以没有类,运行过程中手动加载到内存
//方法三:类加载器:Class.forName(包名.类名)
Class c = Class.forName("com.guoyasoft.implement.StudentWL");
// 2、获取包名,反射里面,每一种java元素,都会封装成一个类
//getPackage()用于查找包,获取包名
Package p = c.getPackage();
//getName()用于取出包名
String packageName = p.getName();
//取出包名并打印
System.out.println("package name =" + packageName);
// 3、获取类名、父类和接口
//获取父类
Class superClass = c;
//判断是否有父类
while (superClass != null) {
//有父类即不等于null时取出父类的类名并打印
System.out.println("super class =" + superClass.getName());
//获取父类,并传给superClass
superClass = superClass.getSuperclass();
}
//获取接口,c.getInterfaces()获得这个对象所实现的所有接口
Class[] interfaces = c.getInterfaces();
//遍历所有接口,并打印所有接口名
for (Class c1 : interfaces) {
System.out.println("接口名称:" + c1.getName());
}
// 4、获取构造器、实例化
//获取构造器对象
//getDeclaredConstructor可以返回指定参数的构造函数
//getConstructor只能返回指定参数的public的构造函数
Constructor constructor = c.getConstructor();
//实例化,constructor.newInstance()是先取了这个类的不带参数的构造方法,然后调用构造方法的newInstance来创建对象
Student wl = (Student) constructor.newInstance();
// 5、获取字段、设置、取值
//获取字段
Field[] fields = c.getFields();
//遍历字段,并打印字段类型及字段名
for (Field f : fields) {
System.out.println("字段名:" + f.getType().getName() + " "
+ f.getName());
}
//getField(String name)是返回指定名称中的所有public属性
Field name=c.getField("name");
//给w1中name的字段设置值为吴令
name.set(wl, "吴令");
//给w1中age的字段设置值为23
Field age=c.getField("age");
age.set(wl, 23);
//toString()转换成字符串
System.out.println("反射设置:"+wl.toString());
// 6、获取方法
//getDeclaredMethods()获取对象本身的所有方法,不包括继承的方法
//getMethods()只能拿到public方法(包括继承的类或接口的方法)
Method[] methods = c.getDeclaredMethods();
//遍历方法,打印方法名:返回值类型 方法名(参数)
for (Method m : methods) {
System.out.println("方法名:" + m.getReturnType().toString() + " "
+ m.getName() + "(" + m.getParameterTypes() + ")");
}
//getMethods(methodName, parameterTypes)
//通过反射获取方法,String.class将参数方法转换成字符串的格式读取出来
Method doHomeWork=c.getMethod("doHomeWork", String.class);
//invoke(class, method)通过invoke激活调用该方法
doHomeWork.invoke(wl, "反射调用method");
Method learn=c.getMethod("learn", String.class);
learn.invoke(wl, "法语");
}
}