投稿 资料上传 搜索
您现在的位置是: 首页 > 文章 > 正文

java反射机制-高级特性详解

.   介绍

    Java的反射机制是指在程序的运行状态中,可以动态的构造任意一个类的对象,可以了解任意一个对象所属的类,可以了解任意一个类的成员变量和方法,可以调用任意一个对象的属性和方法,这就是JAVA反射的特性。

Java反射机制提供了那些功能:

1.     在运行时判断任意一个对象所属的类

2.      在运行时构造任意一个类的对象

3.      在运行时判断任意一个类所具有的成员变量和方法;

4.      在运行时调用任意一个对象的方法

二.JAVA反射的使用

    1.获取class类对象的方式

              a.通过Object类的getClass()方法获取

                     例如:

                            Person person=new Person();

                            Class<?> cls=person.getClass();

                            Person person2=( Person) cls.newInstance();

                b.通过静态属性Class方式获取

                      例如:

                             Class<?> cls=Person.Class();

                             Person person=( Person) cls.newInstance();

               c.通过Class类中静态方法forName()方法获取

                       例如:

                             Class<?> cls= Class.forName(“包名.类全名”)//如:com.cn. Person

                             Person person=( Person) cls.newInstance();

    2.反射获取构造器方法

           a. 获取所有构造器

                public Constructor[] getConstructors()

                public Constructor[] getDeclaredConstructors()

           b.获取单个指定构造器

                 public Constructor getConstructor(Class... parameterTypes)

                 public Constructor getDeclaredConstructor(Class... parameterTypes)

    3.反射获取方法

          a.获取所有方法

                  getDeclareMethods()

          b.获取方法的返回值类型

                  getReturnType()

          c. 获取方法的传入参数类型

                  getParameterTypes();

           d.获取指定的方法

                  getDeclareMethod"方法名,参数类型.class,...."

1.  成员变量

a. 获取所有成员变量

getDeclaredFields 

b. 获取特定的成员变量

getDeclaredField(参数类型.class,....) 

2.  父类和父接口

a.获取某类的父类

getSuperclass()

b. 获取某类实现的接口

getInterfaces()

三.   反射使用例子

1.  定义一个Car类,该类拥有两个构造函数、一个方法及3个属性,如下所示:

public class Car {
private String brand;
private String color;
private int maxSpeed;

public Car() {
System.out.println("init 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 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;
}
}

2. 通过反射机制操作如下:

import java.lang.reflect.Constructor;
import java.lang.reflect.Method;

public class ReflectTest {

public static Car initByDefaultConst() throws Throwable {

//①通过类装载器获取Car类对象
ClassLoader loader = Thread.currentThread().getContextClassLoader();
Class clazz = loader.loadClass("com.smart.reflect.Car");

//②获取类的默认构造器对象并通过它实例化Car
Constructor cons = clazz.getDeclaredConstructor((Class[]) null);
Car car = (Car) cons.newInstance();

//③通过反射方法设置属性
Method setBrand = clazz.getMethod("setBrand", String.class);
setBrand.invoke(car, "红旗CA72");
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 = initByDefaultConst();
car.introduce();
}
}



转载于:

文章标签:
阿里云服务器采购季
给作者打赏,鼓励TA抓紧创作!
评论
  1. 旧城旧巷
    旧城旧巷IT技术之家

    大佬,受教了~~~~~~~~

    回复