反射
概述
Reflection(反射)被视为动态语言的关键。在程序执行期借助反射API获取类的内部信息,从而操作类的属性及方法。
方法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| public class Person{ private String name; public int age; public Person(){} public Person(String name,int age){ this.name = name; this.age =age; } private Person(String name){ this.name = name; } ... public getXxx()/SetXxx() ... public toString(){} public show(){} private String show(String msg){} }
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| Class clazz = Person.class;
Constructor cons = clazz.getContructor(String.class,int.class); Person p = (Person)cons.newInstance("Tom",12);
Field age = clazz.getDeclaredField("age"); age.set(p,10);
Method show = clazz.getDeclaredMethod("show"); show.invoke(p)
Constructor cons1 = clazz.getDeclaredConstructor(String.class); cons1.setAccessible(true); Person p1 = (Person)cons1.newInstance("Jack");
Field name = clazz.getDeclaredField("name"); name.setAccessible(true); name.set(p1,"Jack1");
Method show = clazz.getDeclaredMethod("show",String.class); show.setAccessible(true); String msg = (String)show.invoke(p1,"你好世界");
|
获取Class实例的方法
1 2 3 4 5 6 7 8 9 10
| Class clazz1 = Person.class;
Person p = new Person(); Class clazz2 = p.getClass();
Class clazz3 = Class.forName("java.lang.String");
ClassLoader classLoader = currentClass.class.getClassLoader(); Class clazz4 = classLoader.loadClass("java.lang,String")
|