2022-08-10反射

目录

什么是反射?

反射能做些什么?

反射的具体实现: 

Class方法:

对成员变量的操作

只能获取public的属性:

可以获取private的属性:

获取对象的属性

获得类的所有方法

通过反射去调用构造器

启用和禁用访问安全检查的开关

将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对象的属性的不安全。

你可能感兴趣的:(java学习日记,java,servlet,开发语言)