java.lang.reflect包
Constructor、Field、Method的父类是AccessibleObject;
一、获得Class对象
Class<?> c = Class.forName("classname"); 抛出ClassNotFoundException
二、获得实现接口
Class<?> inters[] = c.getInterfaces();
for(int i=0;i<inters.length;i++){
System.out.print(inters[i].getName()+" "); //getName()方法为取得接口名称;
}
三、获得父类
Class<?> superClass = c.getSuperclass(); //获得父类
String name = superClass.getName(); //获得父类名称
四、取得构造方法
Constructor cons[] = c.getConstructors(); //获得公开的构造方法
Constructor dcons[] = c.getDeclaredConstructors(); //获得全部构造方法
String modifier = Modifier.toString(cons[i].getModifiers()); //获得访问权限
String name = cons[i].getName(); //获得构造方法名称
Class<?> params[] = cons[i].getParameterTypes(); //获得参数类型对象
五、获得Method
Method ms[] = c.getMethods(); //返回公共的全部方法,包括继承方法
Method dms[] = c.getDeclaredMethods(); //返回本类全部方法,不包括继承的方法
Class<?> rt = ms[i].getReturnType();
Class<?>params[] = ms[i].getParameterTypes();
String name = ms[i].getName();
String modifier = Modifier.toString(ms[i].getModifiers());
Class<?>ex[] = ms[i].getExceptionTypes(); //获得异常
String name = ex[i].getName(); //获得异常名称
六、获得Field
Field fs[] = c.getFields(); //获得公共属性,包括继承属性
Field dfs[] = c.getDeclaredFields(); // 获得本类全部属性
Class<?> type = fs[i].getType(); //获得属性的类型对象
String name = fs[i].getName(); //获得属性的名称
String modifier = Modifier.toString(fs[i].getModifiers());
七、通过反射创建一个对象
Class<?> c = Class.forName("Person");
Person p = (Person)c.newInstance();
八、Constructor创建对象
Class c = Class.forName("Person");
Constructor<?> cons[] = c.getConstructors();
Person p = (Person)cons[0].newInstance("xiazdong",15);
九、调用特定方法
Method m = c1.getMethod("funcname",Class<?>...c); //funcname表示调用方法的名称,c表示参数的Class对象
例如:Method m = c1.getMethod("fun",String.class,int.class); 表示调用fun(String,int);函数
m.invoke(c1.newInstance(),"xiazdong",20); //如果有返回值,则invoke函数返回;
十、调用特定属性
Field f = c1.getDeclaredField("name"); //返回name属性
f.setAccessible(true); //私有属性可见
f.get(Object obj); //返回obj对象的name属性的值
f.set(Object obj,String n); //设置obj对象的name属性为n值;
十一、操作数组
int tmp[] = {1,2,3};
Class<?> c = tmp.getClass().getComponentType();
Array.getLength(tmp); //tmp数组的长度
c.getName(); //获得数组类型名称
Array.get(Object obj,int index); //获得obj数组的index索引的数值
Array.set(Object obj,int index,VALUE); //设置obj数组的index索引的数值为value;
Object obj = Array.newInstance(c,length); //c为数组的类型,length为数组的长度;obj为返回的数组对象;
示例:
1. import
2. public class
3. public static void main(String args[])throws
4. "Person");
5. "sayHello");
6. m.invoke(c1.newInstance());
7. "sayHello2",String.class,int.class);
8. "xiazdong",123);
9. System.out.println(str);
10. "name");
11. "age");
12. true);
13. true);
14. Person obj = (Person)c1.newInstance();
15. "xzdong");
16. 12);
17. System.out.println(nameField.get(obj));
18. System.out.println(ageField.get(obj));
19. "setName",String.class);
20. "changed");
21. "getName");
22. System.out.println(getName.invoke(obj));
23.
24. int tmp[] = {1,2,3};
25. Class<?> c3 = tmp.getClass().getComponentType();
26. System.out.println(c3.getName());
27. "第一个数:"+Array.get(tmp,0));
28. 0,5);
29. "第一个数:"+Array.get(tmp,0));
30.
31. 5);
32. 0,arr,0,Array.getLength(tmp));
33. 2));
34. 3));
35. }
36. }
1. import
2. interface
3. public static final String NAME = "CHINA";
4. public int AGE = 60;
5. public void
6. public String sayHello2(String name,int
7. }
8. class Person implements
9. private
10. private int
11. public
12. return
13. }
14. public void
15. this.name = name;
16. }
17. public int
18. return
19. }
20. public void setAge(int
21. this.age = age;
22. }
23. public void
24. " "+AGE);
25. }
26. public String sayHello2(String name,int
27. return name+" "+age;
28. }
29. }