框架配置文件中,从字符串获取类和实例,调他的方法。
通过反射的方式可以获取class对象中的属性、方法、构造函数等,一下是实例:
package cn.itcast_04_reflect; import java.lang.reflect.Constructor; import java.lang.reflect.Field; import java.lang.reflect.Method; import java.util.ArrayList; import java.util.List; import org.junit.Before; import org.junit.Test; public class MyReflect { public String className = null; public Class personClass = null; //从字符串获取类的定义 @Before public void init() throws Exception { className = "cn.itcast_04_reflect.Person"; personClass = Class.forName(className);//获取类的定义,Class对象。 } @Test public void getClassName() throws Exception { System.out.println(personClass); } //从class中获取类的消息 @Test public void getClassName2() throws Exception { System.out.println(Person.class); } //从Class获取一个对象, 调用空参数的构造方法,来获取对象 @Test public void getNewInstance() throws Exception { System.out.println(personClass.newInstance());//调用tostring()方法输出 } //获取非私有的构造函数 @Test public void getPublicConstructor() throws Exception { Constructor constructor = personClass.getConstructor(Long.class,String.class);//拿到2个参数的构造函数 Person person = (Person)constructor.newInstance(100L,"zhangsan");//通过构造函数获取对象实例 System.out.println(person.getId()); System.out.println(person.getName()); } //获得私有的构造函数 @Test public void getPrivateConstructor() throws Exception { Constructor con = personClass.getDeclaredConstructor(String.class);//获取String类型的私有构造函数 con.setAccessible(true);//强制取消Java的权限检测 Person person2 = (Person)con.newInstance("zhangsan"); System.out.println("**"+person2.getName()); } //访问非私有的成员变量 @Test public void getNotPrivateField() throws Exception { Constructor constructor = personClass.getConstructor(Long.class,String.class); Object obj = constructor.newInstance(100L,"zhangsan");//获取对象 Field field = personClass.getField("name");//获取字段 field.set(obj, "lisi");//设置obj的name属性为lisi System.out.println(field.get(obj)); } //访问私有的成员变量 @Test public void getPrivateField() throws Exception { Constructor constructor = personClass.getConstructor(Long.class); Object obj = constructor.newInstance(100L); Field field2 = personClass.getDeclaredField("id"); field2.setAccessible(true);//强制取消Java的权限检测 field2.set(obj,10000L); System.out.println(field2.get(obj)); } //获取public方法 @Test public void getNotPrivateMethod() throws Exception { System.out.println(personClass.getMethod("toString")); Object obj = personClass.newInstance();//获取空参的构造函数 Method toStringMethod = personClass.getMethod("toString");//获取类的方法 Object object = toStringMethod.invoke(obj);//调用对象的方法 System.out.println(object); } //获取私有方法 @SuppressWarnings("unchecked") @Test public void getPrivateMethod() throws Exception { Object obj = personClass.newInstance();//获取空参的构造函数 Method method = personClass.getDeclaredMethod("getSomeThing"); method.setAccessible(true);//私有的要加这一句 Object value = method.invoke(obj);//调用对象的方法 System.out.println(value); } @Test public void otherMethod() throws Exception { //当前这个class文件的类加载器 System.out.println(personClass.getClassLoader()); //获取这个类实现的所有接口 Class[] interfaces = personClass.getInterfaces(); for (Class class1 : interfaces) { System.out.println(class1); } //反射当前这个类的直接父类 System.out.println(personClass.getGenericSuperclass()); /** * getResourceAsStream这个方法可以获取到一个输入流,这个输入流会关联到name所表示的那个文件上。 */ //path 不以’/'开头时默认是从此类所在的包下取资源,以’/'开头则是从ClassPath根下获取。其只是通过path构造一个绝对路径,最终还是由ClassLoader获取资源。 System.out.println(personClass.getResourceAsStream("/log4j.properties")); System.out.println(personClass.getResourceAsStream("log4j.properties")); //判断当前的Class对象表示是否是数组 System.out.println(personClass.isArray()); System.out.println(new String[3].getClass().isArray()); //判断当前的Class对象表示是否是枚举类 System.out.println(personClass.isEnum()); System.out.println(Class.forName("cn.itcast_04_reflect.City").isEnum()); //判断当前的Class对象表示是否是接口 System.out.println(personClass.isInterface()); System.out.println(Class.forName("cn.itcast_04_reflect.TestInterface").isInterface()); } }
package cn.itcast_04_reflect; import java.io.Serializable; public class Person implements Serializable,TestInterface{ private Long id; public String name; public Person() { this.id = 100L; this.name = "afsdfasd"; } public Person(Long id, String name) { // super(); this.id = id; this.name = name; } public Person(Long id) { super(); this.id = id; } private Person(String name) { super(); this.name = name+"======="; } public Long getId() { return id; } public void setId(Long id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String toString() { return "Person [id=" + id + ", name=" + name + "]"; } private String getSomeThing() { return "sdsadasdsasd"; } private void testPrivate(){ System.out.println("this is a private method"); } } public enum City {} public interface TestInterface {}