Java 反射机制

一、定义与概念

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

Class类:Class 类的实例表示正在运行的 Java 应用程序中的类和接口。也就是jvm中有N多的实例每个类都有该Class对象。(包括基本数据类型)Class 没有公共构造方法。Class 对象是在加载类时由 Java 虚拟机以及通过调用类加载器中的defineClass 方法自动构造的。也就是这不需要我们自己去处理创建,JVM已经帮我们创建好了。


二、使用

1.获取Class 对象的方式

a.Object ——> getClass();

b.任何数据类型(包括基本数据类型)都有一个“静态”的class属性:例如Person.class

c.通过Class类的静态方法:forName(String  className)(常用) :  Class.forName();

注意:在运行期间,一个类,只有一个Class对象产生。

三种方式常用第三种,第一种对象都有了还要反射干什么。第二种需要导入类的包,依赖太强,不导包就抛编译错误。一般都第三种,一个字符串可以传入也可写在配置文件中等多种方法。

2.获取构造方法

 a.批量的方法:

public Constructor[] getConstructors():所有"公有的"构造方法

 public Constructor[] getDeclaredConstructors():获取所有的构造方法(包括私有、受保护、默认、公有)

 b.获取单个的方法,并调用:

public Constructor getConstructor(Class... parameterTypes):获取单个的"公有的"构造方法:

public Constructor getDeclaredConstructor(Class... parameterTypes):获取"某个构造方法"可以是私有的,或受保护、默认、公有;

 调用构造方法:

Constructor-->newInstance(Object... initargs)

newInstance是Constructor类的方法(管理构造函数的类)

api的解释为:

newInstance(Object... initargs)

 使用此 Constructor 对象表示的构造方法来创建该构造方法的声明类的新实例,并用指定的初始化参数初始化该实例。

它的返回值是T类型,所以newInstance是创建了一个构造方法的声明类的新实例对象。并为之调用



3.获取方法

Class stu = Class.forName("csdn.Student");

// 获取对象的所有公共方法

Method[] methods = stu.getMethods();

for(Method m : methods) {

System.out.println(m);

}

System.out.println("---------------------");

// 获取对象所有方法,但不包含继承的

Method[] declaredMethods = stu.getDeclaredMethods();

for(Method ms : declaredMethods) {

System.out.println(ms);

}

4.获取属性


//1.获取Class对象

Class stuClass = Class.forName("fanshe.field.Student");

//2.获取字段

System.out.println("************获取所有公有的字段********************");

Field[] fieldArray = stuClass.getFields();

for(Field f : fieldArray){

System.out.println(f);

}

System.out.println("************获取所有的字段(包括私有、受保护、默认的)********************");

fieldArray = stuClass.getDeclaredFields();

for(Field f : fieldArray){

System.out.println(f);

}

System.out.println("*************获取公有字段**并调用***********************************");

Field f = stuClass.getField("name");

System.out.println(f);

//获取一个对象

Object obj = stuClass.getConstructor().newInstance();//产生Student对象--》Student stu = new Student();

//为字段设置值

f.set(obj,"刘德华");//为Student对象中的name属性赋值--》stu.name = "刘德华"

//验证

Student stu = (Student)obj;

System.out.println("验证姓名:"+ stu.name);

System.out.println("**************获取私有字段****并调用********************************");

f = stuClass.getDeclaredField("phoneNum");

System.out.println(f);

f.setAccessible(true);//暴力反射,解除私有限定

f.set(obj,"18888889999");

System.out.println("验证电话:"+ stu);

你可能感兴趣的:(Java 反射机制)