概念:
java反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法,
对于任意一个对象,都能够条用她的任意一个方法和属性,
这种动态的获取信息以及动态调用对象的方法的功能成为java的发射机制
Java反射的功能
1)可以判断运行时对象所属的类
2)可以判断运行时对象所具有的成员变量和方法
3)通过反射甚至可以调用到private的方法
4)生成动态代理
实现Java反射的类
1)Class:它表示正在运行的Java应用程序中的类和接口
2)Field:提供有关类或接口的属性信息,以及对它的动态访问权限
3)Constructor:提供关于类的单个构造方法的信息以及对它的访问权限
4)Method:提供关于类或接口中某个方法信息
注意:Class类是Java反射中最重要的一个功能类,所有获取对象的信息(包括:方法/属性/构造方法/访问权限)
都需要它来实现
类classloader加载方式
- 1)Bootstrap ClassLoader 此加载器采用c++编写,一般开发中很少见。
- 2)Extension ClassLoader 用来进行扩展类的加载,一般对应的是jre\lib\ext目录中的类
- 3)AppClassLoader 加载classpath指定的类,是最常用的加载器,同时也是java中默认的加载器。
例子:
package lxh.reflect;
import java.lang.reflect.*;
public class ReflectDemo {
/**
- 为了看清楚Java反射部分代码,所有异常我都最后抛出来给虚拟机处理
public static void main(String[] args) throws ClassNotFoundException, IllegalAccessException, InstantiationException, InvocationTargetException, NoSuchFieldException, NoSuchMethodException {
System.out.println("demo1:通过Java反射机制得到类的包名和类名");
demo1();
System.out.println("--------------------");
System.out.println("demo2:验证所有的类都是Class类的实例对象");
demo2();
System.out.println("--------------------");
System.out.println("demo3:通过Java反射机制,用 Class 创建类对象,这也就是反射存在的意义所在");
demo3();
System.out.println("---------------------");
System.out.println("demo4:通过Java反射机制得到一个类的构造函数,并实现创建带参实例对象");
demo4();
System.out.println("------------------------");
System.out.println("demo5:通过Java反射机制操作成员变量, set 和 get");
demo5();
System.out.println("-------------------------");
System.out.println("demo6:通过Java反射机制得到类的一些属性:继承的接口、父类、函数信息、成员信息、类型等");
demo6();
System.out.println("--------------------------");
System.out.println("demo7:通过Java反射机制调用类方法");
demo7();
System.out.println("");
System.out.println("demo8:通过Java反射机制得到类加载器信息");
demo8();
}
/**
* demo1:通过Java反射机制得到类的包名和类名
public static void demo1() {
Person person = new Person();
System.out.println(“包名:” + person.getClass().getPackage().getName());
System.out.println(“完整类名:” + person.getClass().getName());
}
/**
* demo2:验证所有的类都是Class类的实例对象
public static void demo2() throws ClassNotFoundException {
//定义两个类型都未知的Class,设置初值为null,看看如何给它们赋值成Person类
Class