c语言sscanf函数的用法是什么
267
2022-11-18
javaRelection
什么是java反射
反射是java中的非常重要的一项机制,也称做Reflection。反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够 调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。
Java反射是可以让我们在运行时获取类的函数、属性、父类、接口等Class内部信息的机制。通过反射还可以让我们在运行期实例化对象,调用方法,通过调用 get/set 方法获取变量的值,即使方法或属性是私有的的也可以通过反射的形式调用,这种“看透 class”的能力被称为内省,这种能力在框架开发中尤为重要。有些情况下,我们要使用的类在运行时才会确定,这个时候我们不能在编译期就使用它,因此只能通过反射的形式来使用在运行时才存在的类(该类符合某种特定的规范,例如 JDBC),这是反射用得比较多的场景。还有一个比较常见的场景就是编译时我们对于类的内部信息不可知, 必须得到运行时才能获取类的具体信息。比如ORM框架,在运行时才能够获取类中的各个属性,然后通过反射的形式获取其属性名和值,存入数据库。这也是反射比较经典应用场景之一。
1.获取Class方法
Class为反射的源头 Person类为Class的对象,故反映出了万物皆对象
对于Class类的理解: 类的加载的过程: 通过javac.exe之后,会生成一个字节码文件.class,然后使用java.exe对于每个字节码文件进行解释,相当与将字节码文件 加载到内存中,叫做类的加载。加载到内存中的类,就为运行时的类,就是Class的一个实类
Person.java
public class Person { private String name; public int age; public Person() { } public Person(String name, int age) { this.name = name; this.age = age; } public Person(String name) { this.name = name; } 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 + '}'; } public void show(){ System.out.println("1"); } public void showNation(String nation){ System.out.println("2" + nation); }}
public void test3() throws ClassNotFoundException { //方法1 Class class1 = Person.class; //方法2 Person p1 = new Person(); Class class2 = p1.getClass(); System.out.println(class1); System.out.println(class2); //方法3 Class class3 = Class.forName("day12.Demo01.Person"); System.out.println(class3); Class class4 = Class.forName("java.lang.String"); System.out.println(class4); System.out.println(class1 == class2); System.out.println(class1 == class3); //加载到内存中的运行时类,会缓存一定时间,在此时间内,可以通过不同方式获取运行时类 //方法4 ClassLoader classLoader = ReflectionDemo.class.getClassLoader(); Class class5 = classLoader.loadClass("day12.Demo01.Person"); System.out.println(class5); }
反射可以取得私有的属性,方法,构造器
public void test2() throws Exception { //反射 Class personClass = Person.class; Constructor constructor = personClass.getConstructor(String.class, int.class); Object obj = constructor.newInstance("tom",12); Person p1 = (Person)obj; System.out.println(p1.toString()); Field age = personClass.getDeclaredField("age"); age.set(p1,10); System.out.println(p1.toString()); Method show = personClass.getDeclaredMethod("show"); show.invoke(p1); //调用私有构造器 Constructor constructor1 = personClass.getDeclaredConstructor(String.class); constructor1.setAccessible(true); Person p2 = (Person)constructor1.newInstance("jerry"); System.out.println(p2); //调用私有方法 Field name = personClass.getDeclaredField("name"); name.setAccessible(true); name.set(p1,"huawei"); System.out.println(p1); //调用私有方法 Method showNation = personClass.getDeclaredMethod("showNation", String.class); showNation.setAccessible(true); String nation = (String) showNation.invoke(p1,"中国");//String nation = p1.showNation("中国"); System.out.println(nation); }
Class可以是哪些结构的对象
可以有Class对象: 1.class 2.interface 3.[] 4.enum 5.annotaion 6.基本数据类型 7.void
public void test4(){ Class c1 = Object.class; Class c2 = Comparable.class; Class c3 = String[].class; Class c4 = int[].class; Class c5 = ElementType.class; Class c6 = Override.class; Class c7 = int.class; Class c8 = Void.class; Class c9 = Class.class; int[] a = new int[100]; int[] b = new int[10]; Class c10 = a.getClass(); Class c11 = b.getClass(); //只要维度和类型一样的都是一样的Class System.out.println(c10 == c11);//true }
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。
发表评论
暂时没有评论,来抢沙发吧~