Java反射学习记录
反射作用
通过Java反射机制,可以在程序中访问已经装载到JVM中的Java对象的描述,实现访问、检测和修改描述Java对象本身信息的功能。
获取一个类的三种方式
public class ReflectTest {
public static void main(String[] args) throws ClassNotFoundException {
//1.对象获取
Person person = new Person();
Class c1 = person.getClass();
//2.类名获取
Class c2 = Person.class;
//3.Class类静态方法获取
Class c3 = Class.forName("Person");
}
}
获取公共构造方法以及实例化对象
//获取全部公共的构造方法,以数组形式放回
Constructor[] constructors = c.getConstructors();
for (Constructor con:constructors){
System.out.println(con);
}
//获取指定构造方法(公共的)
Constructor constructor = c.getConstructor();
// Constructor constructor = c.getConstructor(String.class,int.class);
//实例化对象
Object obj = constuctor.newInstance();
//Object obj = constructor.newInstance("张三", 18);
获取非公共构造方法
public class ReflectTest1 {
public static void main(String[] args) throws Exception {
Class c1 = Class.forName("edu.swpu.day11.Person");
Constructor con = c1.getDeclaredConstructor(int.class, String.class);
//暴力反射AccessibleObject中的setAccessible设置为TRUE
con.setAccessible(true);
Object obj = con.newInstance(18, "李四")
获取成员属性getField
public static void main(String[] args)throws Exception{
Class c = Class.forName("Person");
Object obj = c.newInstance();
Field name = c.getField("name");
name.set(obj,"王五");
System.out.println(obj);
}
获取类方法并运行
public static void main(String[] args)throws Exception{
Class c = Class.forName("Person");
Object obj = c.newInstance();
// /*获取全部方法,不包含继承的*/
Method[] methods = c.getDeclaredMethods();
for (Method m:methods){
System.out.println(m);
}
/*获取指定方法*/
Method method = c.getMethod("eat");
/*运行指定方法*/
method.invoke(obj);
Method run = c.getMethod("run", String.class, double.class);
run.invoke(obj,"三毛",100.25);
}
泛型擦除练习
此处通过直接使用反射技术,直接访问ArrayList的add方法,跳过了泛型的限制
public class ReflectTest7 {
public static void main(String[] args) throws Exception {
ArrayList<String> arr = new ArrayList<String>();
// Class c = Class.forName("java.util.ArrayList");
// Class c = ArrayList.class;
Class c = arr.getClass();
Method method = c.getMethod("add", Object.class);
method.invoke(arr,1);
method.invoke(arr,2);
method.invoke(arr,3);
method.invoke(arr,4);
System.out.println(arr);
}
}