Java反射基础代码
1.通过反射获取成员变量,获取构造方法
public class ReflectDemo1 {
public static void main(String[] args) throws Exception{
//1.获取Person的Classdioxin
Class personClass = Person.class;
/*
1.获取成员变量们
*/
//获取public修饰的成员变量
Field[] fields = personClass.getFields();
for (int i = 0; i < fields.length; i++) {
System.out.println(fields[i]);
}
Field a = personClass.getField("a");
System.out.println(a);
Person p = new Person();
Object o = a.get(p);
System.out.println(o);
a.set(p,"张三");
System.out.println(p);
//获取所有的成员变量
Field[] declaredFields = personClass.getDeclaredFields();
for (int i = 0; i < declaredFields.length; i++) {
System.out.println(declaredFields[i]);
}
Field name = personClass.getDeclaredField("name");
//忽略访问权限修饰符的安全检查
//暴力反射
name.setAccessible(true);
Object o1 = name.get(p);
System.out.println(o1);
/*
获取构造方法
*/
Constructor constructor = personClass.getConstructor(String.class, int.class);
System.out.println(constructor);
Object obj = constructor.newInstance("张三", 23);
System.out.println(obj);
}
}
2.获取成员方法
public class ReflectDemo2 {
public static void main(String[] args) throws Exception{
/*
获取成员方法们
*/
//1.获取Person的Classdioxin
Class personClass = Person.class;
Method eat = personClass.getMethod("eat");
Person p = new Person();
eat.invoke(p);
Method eat1 = personClass.getMethod("eat", String.class);
eat1.invoke(p,"土豆");
}
}
3.获取class的三种方式
public class Demo4 {
public static void main(String[] args) throws Exception{
//1.Class.forName("全类名")
Class cls1 = Class.forName("Demo1.Person");
System.out.println(cls1);
//2.类名.class
Class cls2 = Person.class;
System.out.println(cls2);
//3.对象的getClass()
Person p = new Person();
Class cls3 = p.getClass();
System.out.println(cls3);
//比较三个对象 结果都为true
System.out.println(cls1==cls2);
System.out.println(cls2==cls3);
}
}
4.应用:利用反射技术实现以下步骤
1:将需要创建的对象的全类名和需要执行的方法定义在配置文件中;
2:在程序中加载读取配置文件;
3:使用反射技术加载文件进内存;
4.创建对象;
5.执行方法;
注:这里已经有点像spring的处理方式了,只是spring是写在xml文件里
配置
className=Demo1.Person
methodName=eat
主代码
public class Demo3 {
public static void main(String[] args) throws Exception {
//可以创建任意类对象,可以执行任意方法
/*
不能改变该类的任何代码
比如首先需要Person对象 又要Student对象 就会改变代码
*/
//1.加载配置文件
//1.1创建properties
Properties properties = new Properties();
//1.2加载配置文件,转换为一个集合
//1.2.1获取class目录下的一个配置文件方式
ClassLoader classLoader = Demo3.class.getClassLoader();
InputStream is = classLoader.getResourceAsStream("pro.properties");
properties.load(is);
//2.获取配置文件中定义的数据
String className = properties.getProperty("className");
String methodName = properties.getProperty("methodName");
//用注解代替配置文件
//3.加载该类进内存
Class cls = Class.forName(className);
//4.创建对象
Object o = cls.newInstance();
//5.获取方法对象
Method method = cls.getMethod(methodName);
//6.执行方法
method.invoke(o);
}
}