您的位置:首页 > 编程语言 > Java开发

java反射详解

2012-07-07 19:13 393 查看
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() -- 获得类声明的所有方法
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: