Java的反射机制一起来看看
一、什么是反射机制?
反射就是运行时识别类的能力,在运行时可以获得当前对象的类结构,动态创建类的实例,调用对象的方法等;
获得Class类对象的三种方式:
方式一 :Class.forName(“类名”);
Class类的一个静态方法forName 加载类获得类对象 运行的类库中没有Person类,程序依然可以编译。
Class cls = Class.forName("com.oracle.vo.Person");
方式二: 类名.class
要求运行的类库一定要有Person类
//编译的字节码文件中,会为每个类 定义一个静态的属性class 类型是Class类型
//会为每个类定义一个属性,存储自己类的类对象
Class cls = Person.class;
方式三: 对象.getClass()
要求运行的类库中一定要有Person类 当持有了一个对象时,可以根据对象获得其类对象
Person p = new Person();
//getClass方法是Object类的方法,所有的对象都有getClass方法
Class cls = p.getClass();
二、Class类
API方法
1. getName()
获得类对象对应类的类名(全类名:包名+类名)
2. getSimpleName()
获得类对象对应类的类名
3. getPackage()
获得类对象对应类的包对象
try {
Class cls = Class.forName("com.oracle.vo.Person");
System.out.println(cls.getName());
System.out.println(cls.getSimpleName());
Package page = cls.getPackage();
System.out.println(page.getName());
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
4. getField(String name)
根据名字获得能访问的属性。
5. getDeclaredField(String name)
根据名字获得属性。
6. getDeclaredFields()
获得所有的属性
7. getDeclaredMethod()
8. getDeclaredConstructor(Class... types)
根据参数列表获得构造器
9. newInstance()
通过无参构造器创建对象
10. getSuperClass()
获得父类的类对象
三、Package类
Package对象抽象为包
四、Field类
是属性的抽象,Field类的实例就是某个属性,Field类包括了属性名、属性类型、属性值、修饰范围等。
获得属性对象,主要的作用是对属性进行赋值或取值的操作。
1. get(Object obj) 返回Object
:获得某个对象的属性值。
2. setAccessible(boolean flag)
: 设置属性是否可访问。
3. set(Object obj,Object value)
: 设置属性值
public static void main(String[] args) {
//获得Person的类对象 ,获得Person的Class对象
Person p = new Person();
p.setName("tom");
try {
Class cls = Class.forName("com.oracle.vo.Person");
//获得Person类中所有的属性
Field[] fields = cls.getFields();
//获得Person类中的name属性
Field field = cls.getDeclaredField("name");
System.out.println(field.getName());
//获得 某个Person对象 的name属性值
//field: Person类的name属性
//设置这个属性可访问,忽略修饰范围
field.setAccessible(true);
//设置p对象的name属性值 为jack
field.set(p, "jack");
System.out.println(field.get(p));
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (NoSuchFieldException e) {
e.printStackTrace();
} catch (SecurityException e) {
e.printStackTrace();
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
五、Method类
invoke(Object obj, Object ... args) 返回Object : 执行method方法
public static void main(String[] args) {
//获得Person的类对象 ,获得Person的Class对象
Person p = new Person();
p.setName("tom");
try {
Class cls = Class.forName("com.oracle.vo.Person");
//获得Person类的 method(String name) 方法对象
Method method1 = cls.getDeclaredMethod("method", String.class);
//获得Person类的 method() 方法对象
Method method2 = cls.getDeclaredMethod("method");
//method(int i,String name) 方法对象
Method method3 = cls.getDeclaredMethod("method",int.class,String.class);
//获得全部方法
Method[] methods = cls.getDeclaredMethods();
//获得方法要作什么? 就是要调用方法
//obj参数: 调用哪个对象的方法
method1.invoke(p, "abc");
System.out.println(method3.invoke(p, 10,"abcd"));
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SecurityException e) {
e.printStackTrace();
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
}
六、Constructor类
newInstance(Object ... args) 调用构造器创建对象
public static void main(String[] args) {
//获得Person的类对象 ,获得Person的Class对象
Person p = new Person();
p.setName("tom");
try {
Class cls = Class.forName("com.oracle.vo.Person");
//获得 public Person() 构造器
Constructor constructor1 = cls.getDeclaredConstructor();
//public Person(String name, int age) 构造器
Constructor constructor2 = cls.getDeclaredConstructor(String.class,int.class);
//获得构造器的作用,要调用构造器创建对象
Object obj1 = constructor1.newInstance();
Object obj2 = constructor2.newInstance("tom",20);
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SecurityException e) {
e.printStackTrace();
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
}
总结
本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注编程网的更多内容!
免责声明:
① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。
② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341