目录
什么是反射?
反射能做些什么?
反射的具体实现:
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
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():获得类的完整名字。对成员变量的操作 Class
getFields():获得类的public类型的属性。
getDeclaredFields():获得类的所有属性。包括private 声明的和继承类
getMethods():获得类的public类型的方法。
getDeclaredMethods():获得类的所有方法。包括private 声明的和继承类
getMethod(String name, Class[] parameterTypes):获得类的特定方法,name参数指定方法的名字,parameterTypes 参数指定方法的参数类型。
getConstructors():获得类的public类型的构造方法。
getConstructor(Class[] parameterTypes):获得类的特定构造方法,parameterTypes 参数指定构造方法的参数类型。
newInstance():通过类的不带参数的构造方法创建这个类的一个对象。
只能获取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对象的属性的不安全。
推荐阅读
- java学习日记|2022-08-11 学习日记(31st day)网络通信(网络编程)
- SpringBoot|[SpringBoot系列]SpringBoot如何整合SSMP
- java|基于SpringBoot的SSMP整合案例
- SpringBoot|[SpringBoot系列]基础过渡与夯实(创建Boot项目的新方式、Boot简化核心)
- SpringBoot|[SpringBoot系列]基础过渡与夯实(基础配置)
- linux部署jar包脚本和注册开机启动
- Java四大引用详解(强引用、软引用、弱引用、虚引用)
- 《Effective Java》第9条(try-with-resources优先于try-finally)
- 微服务|Eureka快速入门,Eureka简介,什么是Eureka(Eureka注册中心配置)