反射
反射的概念
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 | public class Person { private String name; public int age; public Person(String name, int age) { this .name = name; this .age = age; } private Person(String name) { this .name = name; } private String show(String s) { return "调用私有方法:" + s; } public String getName() { return name; } public void setName(String name) { this .name = name; } public int getAge() { return age; } public void setAge( int age) { this .age = age; } @Override public String toString() { return "Person{" + "name='" + name + '\ '' + ", age=" + age + '}' ; } } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | @Test public void Test() throws Exception{ Class<Person> clazz = Person. class ; //调用空参构造器 Person p = clazz.newInstance(); //通过反射,创建Person类的对象 Constructor<Person> constructor = clazz.getConstructor(String. class , int . class ); Person p1 = constructor.newInstance( "张三" , 20 ); System.out.println(p1); //Person{name='张三', age=20} //通过反射,调用对象指定的属性、方法 //设置属性 Field name = clazz.getDeclaredField( "name" ); name.setAccessible( true ); name.set(p1, "里斯" ); System.out.println(p1); //Person{name='里斯', age=20} //调用私有方法 Method show = clazz.getDeclaredMethod( "show" , String. class ); show.setAccessible( true ); String str = (String) show.invoke(p1, "私有方法" ); System.out.println(str); } |
关于Java.lang.Class类的理解
1.类的加载过程:
程序经过javac.exe命令以后,会生成一个或多个字节码文件(.class),使用java.exe命令对某个字节码文件进行解释运行。相当于将某个字节码文件加载到内存中,此过程称类的加载。加载到内存中的类,成为运行时类,此运行时类,就作为Class的一个实例。
2.Class的实例对应着一个运行时类。
3.加载到内存中的运行时类,会缓存一定的时间,在此时间之内,可以通过不同的方式来获取此运行时类。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | public class ReflectTest { @Test public void test2() throws ClassNotFoundException { //方式一:调用运行时类的属性:.class Class clazz1 = Person. class ; //方式二:通过运行时类的对象,调用getClass() Person p1 = new Person( "aa" , 10 ); Class clazz2 = p1.getClass(); //方式三:调用Class的静态方法:forName(String classPath) 全类名 Class clazz3 = Class.forName( "mianxiangduixiang.java8.Person" ); //方式四:使用类的加载器ClassLoader ClassLoader classLoader = ReflectTest. class .getClassLoader(); Class clazz4 = classLoader.loadClass( "mianxiangduixiang.java8.Person" ); System.out.println(clazz1==clazz2); //true System.out.println(clazz1==clazz3); //true System.out.println(clazz1==clazz4); //true } } |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
2021-09-04 v-on修饰符
2021-09-04 v-on使用