补充:类的组成:
类-|属性
|
|方法-|成员方法(即实例方法 类方法)
|
|构造方法
作用:可以将类中的成员方法(Method),构造方法(Constructor),属性(Field)通过反射得到各个组成部分,我们就可以对各个部分进行操作。反射一般应用于框架中,可以提高程序的复用性。
---------------------------------------------------------------
要想使用反射去获取各个组成部分,首先必须获取Class。
也就是说,通过Class就可以获取到Constructor Method, Field对象。
怎样获取一个Class
1.类型.class
2.对象.getClass();
注:以上两种方式,它们具有依赖性。依赖于具体的API
3.通过Class的forName方法
Class.forName(String className);
----------------------------------------------------------------------------------
1.Constructor(构造器)
有了构造器,可以创建对象。
1.怎样得到一个构造器对象.
Constructor Class.getConstructor(Class... c);
只能获取public的构造
Constructor[] Class.getConstructors();
只能获取public的构造
问题:以上操作,只能获取public构造器,那么怎样可以获取非publlic构造器?
Constructor Class.getDeclaredConstructor(Class... c);
Constructor[] Class.getDeclaredConstructors();
2.怎样通过Constructor去实例化对象.
Constructor类中提供一个方法
newInstance(Object... obj);
注意:newInstance方法一定要与获取的构造器匹配,也就是说,构造器有参数,在newInstance时也要传递参数。
权限修饰符
public 包外 包外子类 包内 类内
protected 包外子类 包内 类内
默认 包内 类内
private 类内
问题:如果使用反射时,它的权限不在指定的范围内,是不是就不可以使用了?
public void setAccessible(boolean flag)
throws SecurityException将此对象的 accessible 标志设置为指示的布尔值。
值为 true 则指示反射的对象在使用时应该取消 Java 语言访问检查。
值为 false 则指示反射的对象应该实施 Java 语言访问检查。
这个方法是AccessibleObject类中的方法,这个类是Constructor,Field,Method的父类。
扩展:我们也可以通过Class对象直接调用newInstance()方法,它默认使用的是无参数构造。
----------------------------------------------------------------------------------------------
Field类.
它代表的是一个属性。对于属性我们的操作就是取舍与赋值操作。
1.获取Filed
Field Class.getField(String name);
Field[] Class.getFileds();
Class.getDeclaredField(String name);
Class.getDeclaredFields();
注意:反射是在java.lang.reflect包下.
2.对Filed操作.
赋值
set(Object obj,Object value); //obj.属性=value
obj:代表的是这个属性所属于的对象。
value:代表的是属性值.
取值
get(Object obj)
obj:代表的是这个属性所属于的对象。
-------------------------------------------------------------------------------
Method类
它代表的是一个方法对象。
1.怎样获取一个Method
Class.getMethod(String name,Class... obj);
Class.getDeclaredMethod(String name,Class... obj);
Class.getMethods(); 获取的方法中包含了父类的方法
Class.getDeclaredMethods(); 只获取子类中的方法
2.怎样让Method执行
Method类中有一个invoke方法。
public Object invoke(Object obj,Object... objs)
作用:是让Method代表的方法执行。
参数:obj 就调用该方法的对象。
参数:objs 它代表的是该方法的参数。
返回值:得到的就是该Method对象代表的方法执行后的结果。
问题1:如果方法是一个静态方法?
如果Method代表的是一个静态方法,可以传递对象,也可以直接写null.
问题2:如果Method代表的方法参数是一个数组类型怎样处理?
需要在传递时,将参数强制转换成Object或在外层在包装一层数组。
==============================================
希望能与更多的java程序员共同学习
扣扣联系:2531977855