反射机制

Class 对象

类是程序的一部分,每个类都有自己的class对象,每当程序中编译了一个新类,就会产生一个class对象。
Java与C/C++不同,Java采用动态加载机制,不会一次性编译所有类,类都是在其第一次使用时加载到JVM里的。一旦某个类的Class对象载入内存,它就被用来创建这个类的全部内存。

import java.lang.reflect.Method;

interface Inter1{}
interface Inter2{}

class A implements Inter1,Inter2{
    A(){};
    public void printinfo(){
        System.out.println("I'm A");
    }
}
public class TestClass {
    public static void main(String[] args) throws IllegalAccessException, InstantiationException {
        A a = new A();
        System.out.println(a.getClass().getName());//返回A的带包名的类名
        Class c = null;
        try {
            c = Class.forName("reflectS.A");//返回一个名为reflectS.A的类的Class对象
        }
        catch (ClassNotFoundException e){
            e.printStackTrace();
        }
        for (Class face:c.getInterfaces()){//返回c的接口的Class对象
            System.out.println(face.getName());
        }
      
reflectS.A
reflectS.Inter1
reflectS.Inter2

在使用forname方法时,会自动初始化该类,此时,类必须有无参的构造方法

类的字面值

也可以使用字面值形式直接获得一个Class引用

 Class a = A.class;

用这种方式是,类不会被自动初始化,但它的超类会被初始化而且它的静态域也会被调用。
可以通过newIncetance方法生成一个Object类对象

        Object o = c.newInstance();
        System.out.println(o instanceof A);//instanceof会判断对象是否属于该类

         true

但生成的对象都是Object类的,使用时要向下转型

泛化的Class引用

可以通过类似泛型的方式来进行类型检查,泛型中的通配,类型限制都适用。

        Class<A> a1 = A.class;
        System.out.format("%s\n",a1.getName());
        A a2 = a1.cast(a1.newInstance());
        a2.printinfo();

reflectS.A
I'm A

使用这种方式还可以适用cast方法进行类型转换。

类方法提取器

可以通过getMethod方法查看类中所有方法

 A a3 = new A();
        Method[] methods = a3.getClass().getMethods();
        for(Method method:methods){
            System.out.println(method.toString());
        }

public void reflectS.A.printinfo()
public final native void java.lang.Object.wait(long) throws java.lang.InterruptedException
public final void java.lang.Object.wait(long,int) throws java.lang.InterruptedException
public final void java.lang.Object.wait() throws java.lang.InterruptedException
public boolean java.lang.Object.equals(java.lang.Object)
public java.lang.String java.lang.Object.toString()
public native int java.lang.Object.hashCode()
public final native java.lang.Class java.lang.Object.getClass()
public final native void java.lang.Object.notify()
public final native void java.lang.Object.notifyAll()

class与instanceof

在查询类型信息时,instanceof与.isInstance方法获得的结果相同,但instanceof关键字还可以查看这个类是不是某个类的子类。

       class B implements A{}
        B b =new B();
        System.out.println(b instanceof A);
        System.out.println(b.getClass().isInstance(A.class));

true
false
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值