Java反射技术

 

Java反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为Java语言的反射机制。

          反射的概念是由Smith在1982年首次提出的,主要是指程序可以访问、检测和修改它本身状态或行为的一种能力。这一概念的提出很快引发了计算机科学领域关于应用反射性的研究。它首先被程序语言的设计领域所采用,并在Lisp和面向对象方面取得了成绩。

Java反射机制主要提供下面几种用途:

          在运行时判断任意一个对象所属的类
          在运行时构造任意一个类的对象
          在运行时判断任意一个类所具有的成员变量和方法
          在运行时调用任意一个对象的方法

 

使用java的反射机制,一般需要遵循三步:

        一、获得你想操作类的Class对象
        二、通过第一步获得的Class对象去取得操作类的方法或是属性名
        三、操作第二步取得的方法或是属性

Java运行的时候,某个类无论生成多少个对象,他们都会对应同一个Class对象,它表示正在运行程序中的类和接口。如何取得操作类的Class对象,常用的有三种方式:

        调用Class的静态方法forName,如上例;
        使用类的.class语法,如:Class cls = String.class;
        调用对象的getClass方法,如:String str = "abc";Class cls = str .getClass();

一、获得想操作的类的对象:

首先创建 ReflectServiceImpl.java 

package net.xrcloud.pojo;

public class ReflectServiceImpl {
    public void sayHello(String name){
        System.out.println("Hello"+name);
    }
}

然后通过反射的方法去构建它

public ReflectServiceImpl getInstance(){
        // 给类加载器注册一个类ReflectServiceImpl的全限定名然后通过newInstance的方法初始化了一个类对象
        ReflectServiceImpl object = null;
        try{
            object = (ReflectServiceImpl) Class.forName("net.xrcloud.pojo.ReflectServiceImpl").newInstance();
        }catch(Exception ex){
            ex.printStackTrace();
        }
        return object;
    }

 

上面的代码实现了一个构造方法没有任何参数的类的反射,下面看一下构造方法带有参数的类的反射

package net.xrcloud.pojo;

public class ReflectServiceImpl {
    private String name;
    
    public ReflectServiceImpl(String name){
        this.name = name;
    }

    public void sayHello(String name){
        System.out.println("Hello"+name);
    }
}

通过反射生成带有参数的构造方法

public ReflectServiceImpl getInstance(){
    // 给类加载器注册一个类ReflectServiceImpl的全限定名然后通过newInstance的方法初始化了一个类对象
    ReflectServiceImpl object = null;
    try{
        object = (ReflectServiceImpl) Class.forName("net.xrcloud.pojo.ReflectServiceImpl").newInstance();
        //通过getConstructor 方法,它的参数可以是多个,这里定义为String.class,意为有且只有一个参数类型为String 的构造方法。
        //通过这个方法可以对重名方法进行排除,然后用newInstance 方法生成对象
        getConstructor(String.class ).newInstance("明昊");
    }catch(Exception ex){
        ex.printStackTrace();
    }
    return object;
}

二、通过第一步获得的Class对象去取得操作类的方法

在使用类的方法之前要获取方法对象,得到了方法才能够去反射

public Object reflectMethod(){
    Object returnObj = null;
    ReflectServiceImpl target = new ReflectServiceImpl();
    try{
        //
        Method method = ReflectServiceImpl.class.getMethod("sayHello",String.class);
        ReturnObj = method.invoke(target,"明昊");
    }catch(ex){
        ex.printStackTrace();
    }

    return returnObj;
}

反射生成对象和反射调用方法

public Object reflect(){
    ReflectServiceImpl object = null;
    try {
        object = (ReflectServiceImpl) Class.forName("net.xrcloud.pojo.ReflectServiceImpl").newInstance();
        Method method = object.getClass().getMethod("sayHello", String.class);
        method.invoke(object, "明昊");
    }catch(Exception ex){
        ex.printStackTrace();
    }
    return object;
}

这样就能反射对象和方法。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值