Java的反射机制一起来看看

网友投稿 277 2022-08-21


Java的反射机制一起来看看

目录一、什么是反射机制?获得Class类对象的三种方式:二、Class类三、Package类四、Field类五、Method类六、Constructor类总结

一、什么是反射机制?

反射就是运行时识别类的能力,在运行时可以获得当前对象的类结构,动态创建类的实例,调用对象的方法等;

获得Class类对象的三种方式:

方式一 :Class.forName(“类名”);

Class类的一个静态方法forName 加载类获得类对象 运行的类库中没有Person类,程序依然可以编译。

Class cls = Class.forName("com.oracle.vo.Person");

方式二: 类名.class

要求运行的类库一定要有Person类

//编译的字节码文件中,会为每个类 定义一个静态的属性class 类型是Class类型

//会为每个类定义一个属性,存储自己类的类对象

Class cls = Person.class;

方式三: 对象.getClass()

要求运行的类库中一定要有Person类 当持有了reSZCze一个对象时,可以根据对象获得其类对象

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 vahttp://lue) : 设置属性值

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.printStackTreSZCzerace();

} catch (InstantiationException e) {

e.printStackTrace();

} catch (IllegalAccessException e) {

e.printStackTrace();

} catch (InvocationTargetException e) {

e.printStackTrace();

}

}

总结

本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注我们的更多内容!


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:Feign调用服务时丢失Cookie和Header信息的解决方案
下一篇:手把手教你使用Java实现在线生成pdf文档
相关文章

 发表评论

暂时没有评论,来抢沙发吧~