反射
1.反射调用构造器,方法,属性
package com.cj.java4; import org.junit.Test; import java.lang.reflect.Constructor; import java.lang.reflect.Field; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; public class ReflectionTest { @Test public void test1(){ Person jack = new Person(12,"jack"); jack.setAge(10); System.out.println(jack.toString()); jack.show(); } @Test public void test2() throws NoSuchMethodException, NoSuchFieldException, IllegalAccessException, InvocationTargetException, InstantiationException { //反射创建对象 Class personClass = Person.class; Constructor cons = personClass.getConstructor(Integer.class,String.class); Object obj = cons.newInstance(12,"jack"); Person p = (Person) obj; System.out.println(p.toString()); //反射指定属性,方法 Field age = personClass.getDeclaredField("age"); age.set(p,12); //调用方法 Method show = personClass.getDeclaredMethod("show"); show.invoke(p); System.out.println("*********************"); //调用私有的构造方法 Constructor con1 = personClass.getDeclaredConstructor(String.class); con1.setAccessible(true); Object obj1 = con1.newInstance("jack"); Person p1 = (Person) obj1; p1.show(); //调用私有的属性 Field name = personClass.getDeclaredField("name"); name.setAccessible(true); name.set(p1,"jack1"); p1.show(); //调用私有方法 Method showNation = personClass.getDeclaredMethod("showNation",String.class); showNation.setAccessible(true); String nation = (String)showNation.invoke(p, "中国人"); System.out.println(nation); } }
2.获取类的加载器
@Test public void test3() throws ClassNotFoundException { //1 通过.class Class clazz1 = Person.class; System.out.println(clazz1); //2 通过对象.getClass Person person = new Person(); Class clazz2 = person.getClass(); System.out.println(clazz2); //3 通过Class静态方法forName Class clazz3 = Class.forName("com.cj.java4.Person"); System.out.println(clazz3); System.out.println(clazz1 == clazz2); System.out.println(clazz1 == clazz3); //4 通过classLoader ClassLoader classLoader = ReflectionTest.class.getClassLoader(); Class clazz4 = classLoader.loadClass("com.cj.java4.Person"); System.out.println(clazz1 == clazz4); }
3.反射的动态性
//反射的动态性 public void test5(){ String classPath = ""; for(int i = 0;i<100;i++){ int num = new Random().nextInt(3); switch (num){ case 0: classPath = "java.util.Date"; break; case 1: classPath = "java.lang.Object"; break; case 2: classPath = "com.cj.java4.Person"; break; } try { Object instance = getInstance(classPath); System.out.println(instance); } catch (Exception e) { e.printStackTrace(); } } } public Object getInstance(String classPath) throws Exception { Class<?> aClass = Class.forName(classPath); Object o = aClass.newInstance(); return o; }
4.获取类的注解
//注解 public void test5() throws NoSuchFieldException { Class<Person> personClass = Person.class; Annotation annotation = personClass.getAnnotation(MyAnnotationType.class); System.out.println(annotation); Field age = personClass.getField("age"); MyAnnotationField annotation1 = age.getAnnotation(MyAnnotationField.class); System.out.println(annotation1); }
person.java
package com.cj.java4; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; @Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) @interface MyAnnotationType { String tableName(); } @Target(ElementType.FIELD) @Retention(RetentionPolicy.RUNTIME) @interface MyAnnotationField { String fieldName(); } @MyAnnotationType(tableName = "db_person") public class Person { @MyAnnotationField(fieldName = "db_age") public Integer age; @MyAnnotationField(fieldName = "db_name") private String name; Person(){ } private Person(String name){ this.name = name; } private Person(Integer age){ this.age = age; } public Person(Integer age, String name){ this.age = age; this.name = name; } public Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } public void show(){ System.out.println(this.name + "-" + this.age); } private String showNation(String nation){ System.out.println("我是"+nation); return nation; } }