TestPo
public class TestPo {
private String username;
public String sex;
public static String email;
private static String phone;
public TestPo() {
super();
}
public TestPo(String username, String sex) {
super();
this.username = username;
this.sex = sex;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public static String getEmail() {
return email;
}
public static void setEmail(String email) {
TestPo.email = email;
}
public static String getPhone() {
return phone;
}
public static void setPhone(String phone) {
TestPo.phone = phone;
}
public void test1(){
System.out.println("test1()");
}
public static void test2(){
System.out.println("test2()");
}
public void add(int a, int b){
System.out.println(a+b);
}
}
反射的三种方法
public class TestReflection {
public static void main(String[] args) {
// 第一种反射
Class clazz = TestPo.class;
// 第二种反射方式
TestPo testPo = new TestPo();
Class clazz = testPo.getClass();
// 第三种反射
try {
Class clazz = Class.forName("Reflection.TestPo"); // 要填写完整的包名
System.out.println(clazz.getName()); // 包名加类名
System.out.println(clazz.getSimpleName()); // 只是类名
System.out.println(clazz.getPackage()); // 完整的包名
// 还有很多方法,可以去查API
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
}
Field(属性)
public static void testField() {
Class clazz = TestPo.class;
Field[] fields = clazz.getFields();
for (int i = 0; i < fields.length; i++) {
System.out.println(fields[i].getName()); // 只出现公共的属性
}
System.out.println("-------");
Field[] fieldsAll = clazz.getDeclaredFields();
for (int i = 0; i < fieldsAll.length; i++) {
System.out.println(fieldsAll[i].getName()); // 出现全部的属性
}
try {
Object obj = clazz.newInstance(); // new一个新实例 注意的是通过无参构造方法new出来的
// 普通属性修改
Field fdS = clazz.getField("sex"); // sex属性的访问权限是public的
fdS.set(obj, "nan");
System.out.println(((TestPo) obj).getSex());
// 非公共字段(非官方说法,至今发现getField只能取到public,此问题待定)
Field fdU = clazz.getDeclaredField("username"); // 注意不要写成getField("username")
fdU.setAccessible(true);
// 将此对象的 accessible 标志设置为指示的布尔值。
// 值为 true 则指示反射的对象在使用时应该取消 Java 语言访问检查。
fdU.set(obj, "xiaowang");
System.out.println(((TestPo) obj).getUsername());
System.out.println("--------");
// 静态属性可以不传对象
Field fdE = clazz.getField("email");
fdE.set(null, "aa@aa.com");
System.out.println(((TestPo) obj).getEmail());
System.out.println(((TestPo) obj).getUsername()); // 通过clazz它们连接在一起
} catch (Exception e) {
e.printStackTrace();
}
}
Method(方法)
public static void testMethod() {
try {
Class clazz = Class.forName("Reflection.TestPo");
Method[] methods = clazz.getDeclaredMethods(); // 和属性一样getMethods不能取出全部
// for (int i = 0; i < methods.length; i++) {
// System.out.println(methods[i].getName());
// }
try {
Method method1 = clazz.getMethod("test1", null);
Object obj = clazz.newInstance();
method1.invoke(obj, null);
// 静态方法可以省略对象
Method method2 = clazz.getMethod("test2", null);
method2.invoke(null, null);
// 关于getMethod和invoke后面参数的问题
Method method3 = clazz.getMethod("add", new Class[] {
int.class, int.class });
// 传int.class是因为Class数组中只能传Class类型
method3.invoke(obj, new Object[] { 123, 123 });
} catch (Exception e) {
e.printStackTrace();
}
} catch (Exception e) {
e.printStackTrace();
}
}
Constructor(构造方法)
public static void testConstructor() {
Class clazz = TestPo.class;
try {
Constructor constructor = clazz.getConstructor(new Class[] {
String.class, String.class });
TestPo tp = (TestPo) constructor.newInstance(new Object[] { "aaa",
"bbb" });
System.out.println(tp.getSex() + "------" + tp.getUsername());
} catch (SecurityException e) {
e.printStackTrace();
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
}
IsInstance(对象匹配)
public static void testIsinstance() {
Class clazz = TestPo.class;
TestPo testPo = new TestPo();
TestReflection testReflection = new TestReflection();
System.out.println(clazz.isInstance(testPo));
// 判定指定的 Object 是否与此 Class 所表示的对象赋值兼容。
System.out.println(clazz.isInstance(testReflection));
}