java的反射机制是怎么实现的,Java反射机制
00-1010一、反射机制是什么?获取类对象有三种方式:第二,类三,包四,字段五,方法六,构造函数总结。
00-1010反射是在运行时识别类的能力。运行时可以获取当前对象的类结构,动态创建类的实例,调用对象的方法等。
目录
方式一 :Class.forName(“类名”);
ForName是该类的静态方法,加载该类以获取类对象。该类运行的类库中没有Person类,程序仍然可以编译。
class cls=class . forname( com . Oracle . VO . person );方式二: 类名.class
所需的类库必须具有Person类。
//在编译后的字节码文件中,会为每个类定义一个静态属性。类类型是类类型。//会为每个类定义一个属性,存储自己类的类对象Class cls=Person.class。方式三: 对象.getClass()
所需的类库中必须有一个Person类。当一个对象被持有时,可以根据该对象获得其类对象。
Person p=新人();//getClass方法是对象类的方法,所有对象都有getClass方法类cls=p . getClass();
一、什么是反射机制?
API方法
1.getName()获取类对象对应类的类名(全类名:包名类名)
2.getSimpleName()获取类对象对应类的类名。
3.getPackage()获取类对象对应类的包对象。
请尝试{ Class cls=Class . forname( com . Oracle . VO . person );system . out . println(cls . getname());system . out . println(cls . get simplename());package page=cls . get package();system . out . println(page . getname());} catch(ClassNotFoundException e){ e . printstacktrace();}4.getField(字符串名称)根据名称获取能访问的属性。
5.getDeclaredField(字符串名称)根据名称获取属性。
6.getDeclaredFields()获取所有属性。
7.getDeclaredMethod()
8.GetDeclaredConstructor(类.types)根据参数列表获取构造函数。
9.newInstance()通过无参数的构造函数创建一个对象。
10.getSuperClass()获取父类的类对象。
获得Class类对象的三种方式:
包对象被抽象为包。
00-1010是属性的抽象,Field类的一个实例就是某个属性。字段类包括属性名称、属性类型、属性值、修改范围等。
获取属性对象的主要作用是对属性赋值或赋值。
1.get(Object obj)返回Object:获取一个对象的属性值。
2.设置可访问(布尔标志)3360设置属性是否可访问。
3.Set(对象obj,对象值):设置属性值
public static void main(string[]args){//获取Person的类对象并获取Perso
n的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(); } }
总结
本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注盛行IT的更多内容!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。