java反射详解

java反射就是让你可以通过名称来得到对象 ( 类,属性,方法 ) 的技术。

例如我们可以通过类名来生成一个类的实例;

知道了方法名,就可以调用这个方法;知道了属性名就可以访问这个属性的值。

我们甚至可以通过反射来设置对象私有属性的值。

下面通过一个实例来说明反射的意义和用途:

public class Car {

    private String brand;

    private String color;

    private int maxSpeed;

    public String getBrand() {
        return brand;
    }

    public void setBrand(String brand) {
        this.brand = brand;
    }

    public String getColor() {
        return color;
    }

    public void setColor(String color) {
        this.color = color;
    }

    public int getMaxSpeed() {
        return maxSpeed;
    }

    public void setMaxSpeed(int maxSpeed) {
        this.maxSpeed = maxSpeed;
    }
    
    public String toString(){
        return "the car is:"+ getBrand() + ", color is:" +getColor() +", maxspeed is:"+getMaxSpeed();
    }

    public Car() {

    }

    public Car(String brand, String color, int maxSpeed) {
        this.brand = brand;
        this.color = color;
        this.maxSpeed = maxSpeed;
    }

    public void introduce() {
        System.out.println("brand:" + brand + ";color:" + color + ";maxSpeed:"
                + maxSpeed);
    }

}
public class ReflectTest {
    
    public static Car initByDefaultConst() throws Throwable{
        
        //通过类装载器 获取Car对象
        ClassLoader loader = Thread.currentThread().getContextClassLoader();
        Class<?> clazz = loader.loadClass("spring.ioc.demo1.Car");
        
        //获取类的默认构造器函数  并 实例化一个对象 效果等同 new Car();
        /*Constructor<?> cons = clazz.getDeclaredConstructor((Class[])null);
        Car car = (Car)cons.newInstance();*/
        
        //获取类的带参数的构造器函数getConstructor 必须是public的构造方法
        Class pTypes[] = {String.class,String.class,int.class};
        Constructor cons2 = clazz.getDeclaredConstructor(pTypes);
        Car car = (Car)cons2.newInstance("a","b",1);
        
        //通过反射方法设置属性
        /*Method setBrand = clazz.getMethod("setBrand", String.class);
        setBrand.invoke(car, "红旗001");
        Method setColor = clazz.getMethod("setColor", String.class);
        setColor.invoke(car, "黑色");
        Method setMaxSpeed = clazz.getMethod("setMaxSpeed", int.class);
        setMaxSpeed.invoke(car, 200);*/
        
        return car;
    }
    
    public static void main(String[] args) throws Throwable {
        Car car = ReflectTest.initByDefaultConst();
        car.introduce();
    }
}

通过反射我们可以看到我们可以直接设置对象的私有属性,

也可以通过调用属性的set方法来给属性赋值,

Spring框架中的ioc依赖注入转就是大量利用了java本身的反射机制,

框架把我们手写的代码封装了一下,这样我们就可以通过spring配置文件来直接进行配置。

 

Java的类反射所需要的类并不多,它们分别是:Field、Constructor、Method、Class、Object,下面我将对这些类做一个简单的说明。

Field类:提供有关类或接口的属性的信息,以及对它的动态访问权限。反射的字段可能是一个类(静态)属性或实例属性,简单的理解可以把它看成一个封装反射类的属性的类。

Constructor类:提供关于类的单个构造方法的信息以及对它的访问权限。这个类和Field类不同,Field类封装了反射类的属性,而Constructor类则封装了反射类的构造方法。

Method类:提供关于类或接口上单独某个方法的信息。所反映的方法可能是类方法或实例方法(包括抽象方法)。 这个类不难理解,它是用来封装反射类方法的一个类。

Class类:类的实例表示正在运行的 Java 应用程序中的类和接口。枚举是一种类,注释是一种接口。每个数组属于被映射为 Class 对象的一个类,所有具有相同元素类型和维数的数组都共享该 Class 对象。

对于以下三类组件中的任何一类来说 -- 构造函数、字段和方法 -- java.lang.Class 提供四种独立的反射调用,以不同的方式来获得信息。

调用都遵循一种标准格式。

用于查找构造函数的一组反射调用:

l         Constructor getConstructor(Class[] params) -- 获得使用特殊的参数类型的公共构造函数,

l         Constructor[] getConstructors() -- 获得类的所有公共构造函数

l         Constructor getDeclaredConstructor(Class[] params) -- 获得使用特定参数类型的构造函数(与接入级别无关)

l         Constructor[] getDeclaredConstructors() -- 获得类的所有构造函数(与接入级别无关) 

 

获得字段信息的Class 反射调用不同于那些用于接入构造函数的调用,在参数类型数组中使用了字段名:

l         Field getField(String name) -- 获得命名的公共字段

l         Field[] getFields() -- 获得类的所有公共字段

l         Field getDeclaredField(String name) -- 获得类声明的命名的字段

l         Field[] getDeclaredFields() -- 获得类声明的所有字段 

 

用于获得方法信息函数:

l         Method getMethod(String name, Class[] params) -- 使用特定的参数类型,获得命名的公共方法

l         Method[] getMethods() -- 获得类的所有公共方法

l         Method getDeclaredMethod(String name, Class[] params) -- 使用特写的参数类型,获得类声明的命名的方法

l         Method[] getDeclaredMethods() -- 获得类声明的所有方法 

转载于:https://www.cnblogs.com/NicholasLee/archive/2012/07/07/2580813.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值