Java反射的部分基础使用方法,这次是关于反射的数据操作部分。
ps: 更多请参照第一部分:
Java反射的部分基础使用方法(一)
Jinondo.java
package CYT;
public class Jinondo {
private int age;
private String nameString;
public Jinondo() {
this.age = 20;
this.nameString = "Jinondo";
}
public Jinondo(int age, String nameString) {
this.age = age;
this.nameString = nameString;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getNameString() {
return nameString;
}
public void setNameString(String nameString) {
this.nameString = nameString;
}
}
Jinondo3.java
package CYT;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
public class Jinondo3 {
public static void main(String[] args)
throws Exception {
String path = "CYT.Jinondo"; // 路径
try {
// Class clazz = Class.forName(path);
Class<Jinondo> clazz = (Class<Jinondo>) Class.forName(path);// 如果这样写创建实例就不用强制强制转化
// java9要用构造器去创建实例了
Jinondo instance1 = clazz.getDeclaredConstructor(null).newInstance(null); // 这是调用默认构造方法
System.out.println(instance1);
// 通过反射调用构造方法
Constructor<Jinondo> constructor = clazz.getDeclaredConstructor(int.class,String.class);
Jinondo instance2 = constructor.newInstance(1,"ChenYt"); // 调用有参构造方法
System.out.println(instance2);
System.out.println(instance2.getNameString()+"-"+instance2.getAge()+"岁");
// 通过反射调用普通方法
Jinondo instance3 = clazz.getDeclaredConstructor(null).newInstance(null);
// instance3.setNameString("G-dragon"); 这条代码是直接通过实例去调用
Method method = clazz.getDeclaredMethod("setNameString", String.class);
method.invoke(instance3, "G-dragon"); // 激活
System.out.println(instance3.getNameString());
// 通过反射操作属性
Jinondo instance4 = clazz.getDeclaredConstructor(null).newInstance();
Field field = clazz.getDeclaredField("nameString");
field.setAccessible(true); // 加此语句则不用检查该属性的权限,不加后面会出错
field.set(instance4, "KwonJiyong");
System.out.println(instance4.getNameString()); // 通过实例调用
System.out.println(field.get(instance4)); // 通过反射调用
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
运行结果:
CYT.Jinondo@368239c8
ChenYt-1岁
G-dragon
KwonJiyong
KwonJiyong