反射: 就是java语言在运行时拥有一项自观的能力,把java中的各个成分映射成相应的java类
我的理解:万事万物都能用对象表示,那么java中的类也能用对象表示 Class ,
有了对象后,我们就能使用对象的方法调用 成员,方法,变量 这种方式称之为反射
class,Constructor,Field,Method;
class - 代表对象,
Constructor-类的构造器对象,
Field-类的属性对象,
Method-类的方法对象
Class 类: 在计算机中 由0和1组成的 字节码
Class中的各种方法
isPrimitive()
判断是否为基本数据类型boolean、byte
、char
、short
、int
、long
、float
和double
。
还有VOID
一共9个
AccessibleObject 类是 Field、Method 和 Constructor 对象的基类。
它提供了将反射的对象标记为在使用时取消默认 Java 语言访问控制检查的能力。
对于公共成员、默认(打包)访问成员、受保护成员和私有成员,在分别使用 Field、Method 或 Constructor 对象来设置或获取字段、调用方法,
或者创建和初始化类的新实例的时候,会执行访问检查。
getpackage()
获取此类的包。
isArray();
判断是否为数组
Constructor类
得到某个类所有的构造方法
例子
Constructor[] constructor = Class.forName("java.lang.String").getConstructors();
得到某一个构造方法
例子
Constructor constructor = Class.forName("java.lang.String").getConstructor(StringBuffer.class);
创建实例对象
通常方法: String str = new String(new String StringBuffer("abc"));
反射方法:String str =(String) constructor.newInstance(new StringBuffer.class);
java中 构造方法没有顺序
Constructor constructor1=String.class.getConstructor(StringBuffer.class);
constructor1.newInstance(initargs);
Constructor constructor1=String.class.getConstructor(StringBuffer.class);
是选择StringBuffer.class 获取方法
用构造方法自己所属的类.方法
newInstance(initargs) 去构造出实例对象
这个方法可以调用很多次
Field
可见的用getField 不可见的 用getDeckaredField
Field[] fields = obj.getClass().getFields();
for(Field field : fields)
{
String oldValue = (String)field.get(obj);
String newValue = oldValue.replace('b','a');
field.set(obj.newValue);
}
JKD1.5后新加的功能
如果在源文件的顶部,添加一条指令
import static java.math.*;
那么就可以使用math类的静态方法和静态域,而不必加类名前缀
例子:
没有静态导入
Math.sqrt(Math.pow(x, 2) + Math.pow(y, 2));
静态导入
import static java.lang.Math.*;
sqrt(pow(x, 2) + pow(y, 2));