Java反射机制主要提供了以下功能: 在运行时判断任意一个对象所属的类;在运行时构造任意一个类的对象;在运行时判断任意一个类所具有的成员变量和方法;在运行时调用任意一个对象的方法;生成动态代理。
反射机制应用场合:在编译时根本无法知道该对象或类可能属于哪些类,程序只依靠运行时信息来发现该对象和类的真实信息
反射的作用:
通过反射可以使程序代码访问装载到JVM 中的类的内部信息
获取已装载类的属性信息
获取已装载类的方法
获取已装载类的构造方法信息
例如一个类User u=new User(); u是类user的对象 那么user是谁的对象那是java.lang.class的对象
class的获取方式
获取方式 说明 实例
object.getclass(); 获取指定对象的的class class user u= neuser();classc=u.getclass;
object.class class 直接获取 class c=user.class;
c;lass forName("类名"); 用class的静态方法传入类的全称 class forName("文件路径")
在JDK中,主要由以下类来实现Java反射机制,这些类
都位于java.lang.reflect包中
Class类:代表一个类
Field类:代表类的成员变量(也称类的的属性)
Method类:代表类的方法
Constructor类:代表类的构造方法
Array类:提供了动态创建数组,以及访问数组元素的静态方法
获得Class对象
Class c1=Class.forName("cn.bjsxt.bean.User");
sysp("全路径:"+c1.getName());
sysp("类名:"+c1.getSimpleName());
sysp("访问权限:"+Modifier.toString(c1.getModifiers()));
sysp("是否是接口:"+c1.isInterface());
sysp("父亲全路径名:"+c1.getSuperclass().getName());
sysp("父类名:"+c1.getSuperclass().getSimpleName());
通过反射获取类的属性
获取public的属性:object.getFields()
获取所有的属性: object.getDeclaredFields()
根据属性名称获取public的属性信息:
object.getField(“sex”);
根据属性名称获取属性的信息:
object.getDeclaredField(“name”);
通过反射获取类的方法
获得公有的方法(包括父类的,接口的)等:object.getMethods();
获取全部的方法(本类定义的):object.getDeclaredMethods();
根据方法名称获得方法:object.getDeclaredMethods(“show”,null)
object.getDeclaredMethods(“show”,int.class,String.class);
获取方法参数的列表
Class [] cm=方法对象.getParameterTypes();
通过反射获取类的构造方法
获得所有的构造方法: Constructor[]con=object.getDeclaredConstructors();
获得公有的构造方法:Constructor [] con=obj.getConstructors();
根据参数获得指定的构造方法:
object.getConstructors(int.class,int.class,String.class);
object.getConstructors(null);
使用反射动态创建对象
方法一:使用Class的newInstance()方法,仅适用于无参构造方法
Class<User> clazz=(Class<User>)Class.forName("cn.bjsxt.bean.User");
User u=clazz.newInstance();
方法二:调用Constructor的newInstance()方法,适用所有构造方法
Constructor<User> cons = clazz.getConstructor(
int.class,int.class, String.class,String.class );
User u= cons.newInstance( 1001,19,"王一一","男");