1、什么是反射
1.1:反射java语言中的一种机制,通过这种机制可以动态的实例化对象、读写属性、调用方法
1.2:反射是一种基石(基础)
-
一切反射相关的代码都从获得类对象开始
2.1 Class.forName(完整类名)
2.2 类名.class
2.3 对象.getClass() -
一切反射相关的代码都从获得类对象开始
3.1 Class.forName(完整类名)
3.2 类名.class
3.3 对象.getClass() -
反射三大作用(java.lang.reflect.*)
4.1 实例化对象
1、无参公有的实例化
Student stu=new Student();
Class<? extends Student> clz=stu.getClass();
Student stu2 =(Student) clz.newInstance();
2、有一个参数公有的构造器实例化
Constructor<? extends Student> c = clz.getConstructor(String.class);
Student stu3 = c.newInstance("s001");
3、有两个参数的公有的构造器实例化
Constructor<? extends Student> c2 = clz.getConstructor(String.class,String.class);
Student stu4 = c2.newInstance("s001","张三");
4、私有的构造器实例化
Constructor<? extends Student> c3 = clz.getDeclaredConstructor(Integer.class);
c3.setAccessible(true);
Student stu6=c3.newInstance(22);
4.2 动态调用方法
1、无参公有的方法调用
Student stu=new Student();
Class<? extends Student> clz=stu.getClass();
Method m = clz.getMethod("hello");
Object invoke = m.invoke(stu);
//动态被调用的方法,如果该方法是void类型的返回值,那么被invoke,此时结果为null
System.out.println(invoke);
2、有一个参数方法调用
Method m2 = clz.getMethod("hello", String.class);
Object invoke2 = m2.invoke(stu, "zhangsan");
System.out.println(invoke2);
3、私有的方法调用
Method m3 = clz.getDeclaredMethod("add", Integer.class,Integer.class);
m3.setAccessible(true);
Object invoke3 = m3.invoke(stu, 20,5);
System.out.println(invoke3);
4.3读写属性
公有的、私有的读写属性
package com.liubiao.reflect;
import java.lang.reflect.Field;
/**
* 反射读写属性
* 公有的、私有的读写属性
* @author liubiao
*
* http://javalb.com
*/
public class Demo4 {
public static void main(String[] args) throws Exception {
Student stu=new Student("s001","zhangsan");
stu.age=22;
Class<? extends Student> clz = stu.getClass();
System.out.println(stu.getSname());
System.out.println("---------------------------");
Field f = clz.getDeclaredField("sname");
f.setAccessible(true);
System.out.println(f.get(stu));
//反射读写属性常用方法(一次性获取该类的所有属性值)
System.out.println("----------------------------");
Field[] fs = clz.getDeclaredFields();
for (Field ff : fs) {
ff.setAccessible(true);
System.out.println(ff.get(stu));
}
System.out.println("-------------设置---------------");
//想通过反射改变sname对应的值
f.set(stu, "list");
System.out.println(stu.getSname());
}
}