//反射类
package cn.study.reflect;
import java.awt.List;
public class StudyReflect {
//参构造函数
public StudyReflect() {
System.out.println("Constructor:StudyReflect()");
}
public StudyReflect(String name) {
System.out.println("Constructor:StudyReflect(String name)" + name);
}
private StudyReflect(List list[]) {
System.out.println("Constructor:StudyReflect(List list)" + list.toString());
}
//方法
public void method() {
System.out.println("method:method()");
}
private int[] method(List list) {
System.out.println("method:method(List list)" + list.toString());
return new int[]{1, 2, 3};
}
public static void method(String[] args) {
for (String arg :args) {
System.out.println("arg = " + arg);
}
System.out.println("method:method(String string)" + args);
}
//属性或字段
private String field = "fiedltest";
public String getField() {
return field;
}
public void setField(String field) {
this.field = field;
}
}
//测试类
package cn.study.reflect;
import java.awt.List;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
public class DemoReflect {
public static void main(String[] args) throws Exception {
System.out.println("------Class------");
//装载类
Class clazz = Class.forName("cn.study.reflect.StudyReflect");
//其它加载方法
//Class clazz1 = StudyReflect.class;
//Class clazz2 = new StudyReflect().getClass();
System.out.println("------Constructor------");
//反射构造函数
//public StudyReflect()
Constructor c = clazz.getConstructor(null);
Object obj = c.newInstance(null);
System.out.println(obj.getClass());
StudyReflect sr = (StudyReflect) obj;
System.out.println(sr.getField());
System.out.println("------------");
//public StudyReflect(String name)
Constructor c1 = clazz.getConstructor(String.class);
StudyReflect sr1 = (StudyReflect) c1.newInstance("TestConstructor");
System.out.println(sr1.getField());
System.out.println("------------");
//private StudyReflect(List list[])
Constructor c2 = clazz.getDeclaredConstructor(List[].class);
c2.setAccessible(true); //暴力反射
StudyReflect sr2 = (StudyReflect) c2.newInstance((Object) new List[4]);
System.out.println(sr2.getField());
System.out.println("------------");
//public StudyReflect() 仅限无参构造函数
StudyReflect sr3 = (StudyReflect) clazz.newInstance();
System.out.println(sr3.getField());
System.out.println("------------");
//遍历
Constructor[] cs = clazz.getDeclaredConstructors();
for (Constructor cr :cs) {
System.out.println(":" + cr.getName());
Class[] pts = cr.getParameterTypes();
for (Class pt :pts) {
System.out.println(pt.getName());
}
}
System.out.println("------Method------");
//反射方法
//public void method()
Method m = clazz.getMethod("method", null);
m.invoke(obj, null);
System.out.println("------------");
//private int[] method(List list)
Method m1 = clazz.getDeclaredMethod("method", List.class);
m1.setAccessible(true);
int[] arr = (int[]) m1.invoke(sr1, new List());
for (int v :arr) {
System.out.println("V = " + v);
}
System.out.println("------------");
//public static void method(String[] args)
Method m2 = clazz.getMethod("method", String[].class);
//可变参数要强制转换为一个参数对象
m2.invoke(sr1, (Object)new String[]{"111", "222", "333"});
System.out.println("------------");
//遍历
Method[] mts = clazz.getDeclaredMethods();
for (Method mt :mts) {
System.out.println(":" + mt.getName());
System.out.println("Return:" + mt.getReturnType());
Class[] pts = mt.getParameterTypes();
for (Class pt :pts) {
System.out.println(pt.getName());
}
}
System.out.println("------Field------");
//field
Field f = clazz.getDeclaredField("field");
f.setAccessible(true);
System.out.println("field = " + f.get(sr1));
f.set(sr1, "test");
String field = (String) f.get(sr1);
System.out.println("field = " + field);
}
}
//结果
------Class------
------Constructor------
Constructor:StudyReflect()
class cn.study.reflect.StudyReflect
fiedltest
------------
Constructor:StudyReflect(String name)TestConstructor
fiedltest
------------
Constructor:StudyReflect(List list)[Ljava.awt.List;@23fc4bec
fiedltest
------------
Constructor:StudyReflect()
fiedltest
------------
:cn.study.reflect.StudyReflect
java.lang.String
:cn.study.reflect.StudyReflect
[Ljava.awt.List;
:cn.study.reflect.StudyReflect
------Method------
method:method()
------------
method:method(List list)java.awt.List[list0,0,0,0x0,invalid,selected=null]
V = 1
V = 2
V = 3
------------
arg = 111
arg = 222
arg = 333
method:method(String string)[Ljava.lang.String;@5013582d
------------
:getField
Return:class java.lang.String
:method
Return:void
[Ljava.lang.String;
:method
Return:class [I
java.awt.List
:method
Return:void
:setField
Return:void
java.lang.String
------Field------
field = fiedltest
field = test