java学习日记|2022-08-10反射

目录
什么是反射?
反射能做些什么?
反射的具体实现:
Class方法:
对成员变量的操作
只能获取public的属性:
可以获取private的属性:
获取对象的属性
获得类的所有方法
通过反射去调用构造器
启用和禁用访问安全检查的开关
【java学习日记|2022-08-10反射】将p2对象的f2属性赋值位Bob,f2属性位私有属性name

什么是反射?

Java反射就是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;并且能改变它的属性。而这也是Java被视为动态(或准动态,为啥要说是准动态,因为一般而言的动态语言定义是程序运行时,允许改变程序结构或变量类型,这种语言称为动态语言。从这个观点看,Perl,Python,Ruby是动态语言,C++,Java,C#不是动态语言。)语言的一个关键性质。
反射能做些什么?
我们知道反射机制允许程序在运行时取得任何一个已知名称的class的内部信息,包括包括其modifiers(修饰符),fields(属性),methods(方法)等,并可于运行时改变fields内容或调用methods。那么我们便可以更灵活的编写代码,代码可以在运行时装配,无需在组件之间进行源代码链接,降低代码的耦合度;还有动态代理的实现等等;但是需要注意的是反射使用不当会造成很高的资源消耗!
反射的具体实现:获取类对象:
ps:已经创建了Dog类
1.直接使用类名.class
Class class = Dog.class;
2.获取类的名字
class.getName()
3.获取类的加载器
ClassLoader classLoader = class.getClassLoader();
4.获取资源
URL resource = class.getResource("");
5.获取父类
class.getSuperclass();
6.判断一个类是不是接口,数组
class.isArray();
class.isInterface();
7.使用class类对象实例化一个对象
Dog dog = class.newInstance();
8.使用全类名
Class aclass = Class.forName("com.morning.Dog");
9.使用对象
Dog dog = new Dog(); Class aClass1 = dog.getClass();
Class方法:
getName():获得类的完整名字。
getFields():获得类的public类型的属性。
getDeclaredFields():获得类的所有属性。包括private 声明的和继承类
getMethods():获得类的public类型的方法。
getDeclaredMethods():获得类的所有方法。包括private 声明的和继承类
getMethod(String name, Class[] parameterTypes):获得类的特定方法,name参数指定方法的名字,parameterTypes 参数指定方法的参数类型。
getConstructors():获得类的public类型的构造方法。
getConstructor(Class[] parameterTypes):获得类的特定构造方法,parameterTypes 参数指定构造方法的参数类型。
newInstance():通过类的不带参数的构造方法创建这个类的一个对象。
对成员变量的操作 Class class = Dog.class;
只能获取public的属性:
Field type = clazz.getField("type"); //获取指定属性 System.out.println(type); Field[] fields = clazz.getFields(); System.out.println(Arrays.toString(fields));

可以获取private的属性:
Field name = clazz.getDeclaredField("name"); System.out.println(name); System.out.println(name.getType()); Field[] declaredFields = clazz.getDeclaredFields(); System.out.println(Arrays.toString(declaredFields));

获取对象的属性
Dog dog = new Dog(); dog.setType("金毛"); Dog dog1 = new Dog(); dog1.setType("泰迪"); Class clazz = Dog.class; Field type = clazz.getDeclaredField("type"); // 想要获取哪一个对象的color String str = (String) type.get(dog1); System.out.println(str);

获得类的所有方法
Method [] allMethods = c2.getDeclaredMethods(); for(Method method : allMethods){ System.out.println(method.getName()); //work say }

通过反射去调用构造器
Constructor [] constructors = c2.getConstructors(); for(Constructor constructor : constructors){ System.out.println(constructor.toString()); //public com.ys.reflex.Person() }

启用和禁用访问安全检查的开关 值为 true,则表示反射的对象在使用时应该取消 java 语言的访问检查;反之不取消
f2.setAccessible(true); System.out.println(f2);

将p2对象的f2属性赋值位Bob,f2属性位私有属性name
f2.set(p2,"Bob"); System.out.println(f2.get(p2)); //Bob

使用反射机制可以打破封装性,导致了java对象的属性的不安全。

    推荐阅读