java反射机制。在程序运行的时候获取到类,及类对象,实现动态的获取对象的机制.
比如我门创建一个对的实例化对象的时候,使用Classname obj=new Classname();这样获取到类的对象。然后通过该对象调用一些方法,设置一些属性这样.
对于反射来说,是一开始并不知道我要初始化的类对象是什么,自然也无法使用 new 关键字来创建对象了。
Class<?> aClass = Class.forName("ok.Bean.Student");
Constructor<?> constructor = aClass.getConstructor();
Object o = constructor.newInstance();
分析一些:class.forname获取到的是一个类对象:我们实例化一个类对象看一下。
实例化得到的类对象和forname得到的是同一个类对象。当然也可以通过类名.getclass()获取。
获取到类对象后,我们想要知道更多关于类的东西,如类的属性 构造方法和方法以及 注解;
获取: Filed (name属性,可以设置属性的值,需要参数:对象和值;)
Field[] declaredFields = aClass.getDeclaredFields();
Field name = aClass.getDeclaredField("name");
name.setAccessible(true);
name.set(student1,"小高同志");
获取方法:Method ( 使用invoke()函数实现调用)
Object o = constructor.newInstance();
Method doSome = aClass.getMethod("doSome");
doSome.invoke(o,null);
获取到对象的方法,然后调用。
构造方法:getConstructor 注意参数的类型
有参的构造方法:用参数类型区分开
Class<?> aClass = Class.forName("ok.Bean.Student");
Constructor<?> constructor = aClass.getConstructor();
// Object o = constructor.newInstance();
// Method doSome = aClass.getMethod("doSome");
// doSome.invoke(o,null);
Constructor<?> constructor1 = aClass.getConstructor();
Object o1 = constructor1.newInstance();
System.out.println("实例化");
Constructor<?> constructor2 = aClass.getConstructor(String.class, int.class);
Object Gao = constructor2.newInstance("高", 18);
System.out.println(Gao.toString());
关于注解,学习Spring的时候再学。
关于这个Declar的方式是
getDeclaredFields();
getDeclaredMethod();
getDeclaredConstructor();
getFields():获得某个类的所有的公共(public)的字段,包括父类中的字段。
getDeclaredFields():获得某个类的所有声明的字段,即包括public、private和proteced,但是不包括父类的申明字段。
同样类似的还有getConstructors()和getDeclaredConstructors()、getMethods()和getDeclaredMethods(),这两者分别表示获取某个类的方法、构造函数。