Java基础:反射篇2
1.类的加载器
package com.cl.reflection; import sun.reflect.generics.scope.ClassScope; //类的加载器 public class Test07 { public static void main(String[] args) throws ClassNotFoundException { //获取系统类的加载器 ClassLoader systemClassLoader = ClassLoader.getSystemClassLoader(); System.out.println(systemClassLoader); //获取系统类加载器的父类加载器->扩展类加载器 ClassLoader parent = systemClassLoader.getParent(); System.out.println(parent); //获取扩展类加载器的父类加载器-->根加载器(c/++) ClassLoader parent1 = parent.getParent(); System.out.println(parent1);//null,因为跟加载器是Java类库的核心类库的,不可以直接获取 //测试当前类是那个加载器加载的 ClassLoader classLoader = Class.forName("com.cl.reflection.Test07").getClassLoader(); System.out.println(classLoader); //测试JDK内置的类是谁加载 classLoader = Class.forName("java.lang.Object").getClassLoader(); System.out.println(classLoader); //如何获得系统类加载器可以加载的路径 System.out.println(System.getProperty("java.class.path")); /* D:\java\jdk8\jre\lib\charsets.jar; D:\java\jdk8\jre\lib\deploy.jar; D:\java\jdk8\jre\lib\ext\access-bridge-64.jar; D:\java\jdk8\jre\lib\ext\cldrdata.jar; D:\java\jdk8\jre\lib\ext\dnsns.jar; D:\java\jdk8\jre\lib\ext\jaccess.jar; D:\java\jdk8\jre\lib\ext\jfxrt.jar; D:\java\jdk8\jre\lib\ext\localedata.jar; D:\java\jdk8\jre\lib\ext\nashorn.jar; D:\java\jdk8\jre\lib\ext\sunec.jar; D:\java\jdk8\jre\lib\ext\sunjce_provider.jar; D:\java\jdk8\jre\lib\ext\sunmscapi.jar; D:\java\jdk8\jre\lib\ext\sunpkcs11.jar; D:\java\jdk8\jre\lib\ext\zipfs.jar; D:\java\jdk8\jre\lib\javaws.jar; D:\java\jdk8\jre\lib\jce.jar; D:\java\jdk8\jre\lib\jfr.jar; D:\java\jdk8\jre\lib\jfxswt.jar; D:\java\jdk8\jre\lib\jsse.jar; D:\java\jdk8\jre\lib\management-agent.jar; D:\java\jdk8\jre\lib\plugin.jar; D:\java\jdk8\jre\lib\resources.jar; D:\java\jdk8\jre\lib\rt.jar; D:\Java笔记\注解和 反射\out\production\注解和 反射; C:\Program Files\JetBrains\IntelliJ IDEA 2019.2.4\lib\idea_rt.jar * */ } }
2.获取类的信息
package com.cl.reflection; import java.lang.reflect.Constructor; import java.lang.reflect.Field; import java.lang.reflect.Method; //获取类的信息 public class Test08 { public static void main(String[] args) throws ClassNotFoundException, NoSuchFieldException, NoSuchMethodException { Class c1= Class.forName("com.cl.reflection.User"); User user=new User(); c1=user.getClass(); //获得类的名字 System.out.println(c1.getName());//获得类名加包名 System.out.println(c1.getSimpleName());//获得类名 //获得类的属性 System.out.println("=========================="); Field[] fields=c1.getFields();//只能找到public属性 fields = c1.getDeclaredFields();//找到全部属性 for (Field field : fields) { System.out.println(field); } //获得指定属性的值 Field name = c1.getDeclaredField("name"); System.out.println(name); //获得类的方法 System.out.println("============================"); Method[] methods = c1.getMethods(); for (Method method : methods) { System.out.println("正常的"+method); } methods=c1.getDeclaredMethods(); for (Method method : methods) { System.out.println("getDeclareMethods:"+method); } //获得指定方法 //重载 Method getName=c1.getMethod("getName",null); Method setName=c1.getMethod("setName",String.class); System.out.println(getName); System.out.println(setName); //获得所有构造器 System.out.println("================================="); Constructor[] constructors=c1.getConstructors(); for (Constructor constructor : constructors) { System.out.println(constructor); } constructors=c1.getDeclaredConstructors(); for (Constructor constructor : constructors) { System.out.println("s"+constructor); } //获得指定构造器 Constructor declaredConstructor = c1.getDeclaredConstructor(String.class, int.class, int.class); System.out.println("指定"+declaredConstructor); } } /* 小结:1.在实际操作中,取得类的信息的操作代码,并不会经常开发 2.但一定要熟悉java.lang.reflect包的作用,反射机制 3.如何取得属性,方法,构造器的名称,修饰符等 * */
动态创建对象,通过反射
package com.cl.reflection; import java.lang.reflect.Constructor; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; //动态创建对象,通过反射 public class Test09 { public static void main(String[] args) throws ClassNotFoundException, IllegalAccessException, InstantiationException, NoSuchMethodException, InvocationTargetException { //获得class对象 Class c1=Class.forName("com.cl.reflection.User"); //构造一个对象 //User user=(User)c1.newInstance();//本质调用类的无参构造器 //System.out.println(user); //通过构造器创建对象 Constructor constructor = c1.getDeclaredConstructor(String.class, int.class, int.class); User user2=(User)constructor.newInstance("king",001,18); System.out.println(user2); //通过反射调用普通方法 User user3=(User)c1.newInstance(); //通过反射获取一个方法 Method setName=c1.getDeclaredMethod("setName",String.class); //invoke激活 //(对象,"方法的值") setName.invoke(user3,"king"); System.out.println(user3.getName()); } } /* //实体类:pojo,entity class User{ private String name; private int id; private int age; public User(){ } public User(String name,int id,int age){ this.name=name; this.id=id; this.age=age; } * */
**分析性能问题,通过普通方式调用,反射方式调用,关闭检测的反射调用
package com.cl.reflection; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; //分析性能问题 public class Test10 { //普通方式调用 public static void test01(){ User user = new User(); long startTime=System.currentTimeMillis(); for (int i = 0; i < 1000000000; i++) { user.getName(); } long endTime=System.currentTimeMillis(); System.out.println("普通方式执行10亿次:"+(endTime-startTime)+"ms"); } //反射方式调用 public static void test02() throws NoSuchMethodException, InvocationTargetException, IllegalAccessException { User user = new User(); Class c1= user.getClass(); Method getName = c1.getMethod("getName", null); long startTime=System.currentTimeMillis(); for (int i = 0; i < 1000000000; i++) { getName.invoke(user,null); } long endTime=System.currentTimeMillis(); System.out.println("反射方式执行10亿次:"+(endTime-startTime)+"ms"); } //反射方式调用,关闭检测 public static void test03() throws NoSuchMethodException, InvocationTargetException, IllegalAccessException { User user = new User(); Class c1= user.getClass(); Method getName = c1.getMethod("getName", null); getName.setAccessible(true);//设置权限检查为true,就是关闭 long startTime=System.currentTimeMillis(); for (int i = 0; i < 1000000000; i++) { getName.invoke(user,null); } long endTime=System.currentTimeMillis(); System.out.println("关闭检查执行10亿次:"+(endTime-startTime)+"ms"); } public static void main(String[] args) throws NoSuchMethodException, IllegalAccessException, InvocationTargetException { test01();//5ms test02();//2256ms test03();//1048ms /* 总结;1.普通方式调用类中方法所需时间要远远小于利用反射调用 2.到项目中的反射调用很多时,可以尝试关闭检测,用来提高效率 * */ } }
***练习反射操作注解
package com.cl.reflection; import java.lang.annotation.*; import java.lang.reflect.Field; //练习反射操作注解 public class Text12 { public static void main(String[] args) throws ClassNotFoundException, NoSuchFieldException { Class c1 = Class.forName("com.cl.reflection.Student2"); //通过反射获得注解 Annotation[] annotations = c1.getAnnotations(); for (Annotation annotation : annotations) { System.out.println(annotation); } //获得注解的value的值 TableKing tableKing = (TableKing)c1.getAnnotation(TableKing.class); String value = tableKing.value(); System.out.println(value); //获得类指定的注解 Field f = c1.getDeclaredField("name"); FieldKing annotation = f.getAnnotation(FieldKing.class); System.out.println(annotation.columnName()); System.out.println(annotation.type()); System.out.println(annotation.length()); } } @TableKing("db_student") class Student2{ @FieldKing(columnName = "db_id",type="int",length = 10) private int id; @FieldKing(columnName = "db_age",type="int",length = 10) private int age; @FieldKing(columnName = "db_name",type="int",length = 3) private String name; public Student2() { } public Student2(int id, int age, String name) { this.id = id; this.age = age; this.name = name; } public int getId() { return id; } public void setId(int id) { this.id = id; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } @Override public String toString() { return "Student2{" + "id=" + id + ", age=" + age + ", name='" + name + '\'' + '}'; } } //类名的注解 @Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) @interface TableKing{ String value(); } //属性的注解 @Target(ElementType.FIELD) @Retention(RetentionPolicy.RUNTIME) @interface FieldKing{ String columnName(); String type(); int length(); }