1.6-反射

发布时间 2023-07-18 21:22:18作者: 大元王保保

看这个网站

Q: 调用类对象.class 和 forName(类名)的区别?

Class<A> classA = A.class;
Class<A> classA = Class.forName("A");
A: 仅使用.class不能进行第一次静态初始化, forname函数则可以

例如B是A的基类,下面这段代码如何?
假设有父子2个类,如下:

static class Parent { }
static class Son extends Parent{}


Q: 用instanceof 可以和父类比较吗,且会返回true吗?

        Son son = new Son();
        if (son instanceof  Parent) {
            System.out.println("a instanof B");
        }
A: 可以比较,且返回true。


Q: 用getClass并用== 可以和父类比较吗,且会返回true吗,下面这样:
注意A是B的子类。       

Son son = new Son();
        if (son.getClass() == Parent.class){
            System.out.println("son class == Parent.class");
        }
A: 不可以,编译就会报错了。和Class<泛型>的 ==号比较有关。
image.png
因为getClass返回的是<? extends Son>, .class返回的是Class<Parent>


Q: 用getClass并用.equals可以和父类比较吗,且会返回true吗,下面这样:

Son son = new Son();
        if (son.getClass().equals(Parent.class)){
            System.out.println("son class.equals(Parent.class)");
        }
A: 可以比较,正常编译, 但是会返回false,即不相等!


Q: getDeclaredXXX 有哪几种?
A: 5种:注解Annotation
内部类Classed
构造方法Construcotor
字段Field
方法Method

Q:getMethods()返回哪些方法, getDeclaredMethods()会返回哪些方法?

A:
getMethods()返回 本类、父类、父接口 的public方法
getDeclaredMethods()只 返回本类的 所有 方法

其他getXXX和getDeclaredXXX的区别同理。

 

拿到Filed、Method、Constructor之后咋用

Method可以invoke(object, args)
Constructor可以newInstance(Object…)来做构造调用。
Filed可以用get(object)、set(object)来设置属性值。

 

Q: 反射拿到Method对象后, 该对象.getModifiers() 是干嘛的?
A: 返回该方法的修饰符,并且是1个整数。