当前位置: 首页 > 后端技术 > Java

JAVA基础知识之反射

时间:2023-04-02 09:14:09 Java

以下是我总结的一些简单的JAVA反射相关的小例子。publicclassPerson{publicintage;公共字符串名称;publicintgetAge(){返回年龄;}publicvoidsetAge(intage){this.age=age;}publicStringgetName(){返回名称;}publicvoidsetName(Stringname){this.name=name;}publicPerson(Stringname,intage){this.age=age;this.name=名称;}publicPerson(){}}获取Class的三种方式//FirstClasshelloClass="hello".getClass();ClasshelloClassNew="hello".getClass();ClasshelloClassNew2="hello".getClass();//第二种ClassstringClass=String.class;//第三种StringclassName="java.lang.String";ClassstringClassNew=Class.forName(className);获取父类型和实现的接口类型ClasssuperClass=stringClass.getSuperclass();类[]interfaces=stringClass.getInterfaces();获取类的字段Classclss=Person.class;字段字段=clss.getField("age");//获取这个类也包括父类型的所有public字段Field[]declaredFields=clss.getDeclaredFields();//获取这个类内部的所有字段,不管是private还是publicField[]fields=clss.getFields();获取方法Methodmethod=clss.getMethod("setName",String.class);//获取该类也包括父类型的所有公共方法Method[]declaredMethods=clss.getDeclaredMethods();//获取all类里面的方法,不管是private还是publicMethod[]methods=clss.getMethods();获取构造函数Constructorconstructor=clss.getConstructor(Class..types);//获取里面的所有oftheclassConstructor[]declaredConstructor=clss.getDeclaredConstructors();//获取类Constructor[]constructors=clss.getConstructors();内的所有public构造函数;getmodifiedintmodifiers=constructor.getModifiers();booleanisPublic=Modifier.isPublic(modifiers);设置字段为public值,字段age为publicPersonperson=newPerson();Classo=person.getClass();Fieldfield=o.getDeclaredField("age");field.set(person,"d");System.out.println(person.getAge());//输出d设置字段的值为private,字段名是private的,你需要添加setAccessible为true,如果没有设置如果设置为真,IllegalAccessExceptionPersonperson=newPerson();Classo=person.getClass();Fieldfield=o.getDeclaredField("name");field.setAccessible(true);field.set(person,“d”);System.out.println(person.getName());通过获取字段的注解,进行操作Personperson=newPerson();Classo=person.getClass();Field[]fields=o.getDeclaredFields();for(Fieldfield:fields){if(field.getAnnotatedType(PrimaryKey.class)!=null){//这是主键}if(field.getAnnotatedType(Column.class)!=null){//这是一个读/写的元素}}通过MethodHandles获取类MethodHandles.Lookuplookup=MethodHandles.lookup();ClasspersonClass=MethodHandles.lookup().findClass(Person.class.getName());创建四种method//getter方法MethodTypegetterType=MethodType.methodType(String.class);MethodHandlegetterHandle=lookup.findVirtual(Person.class,"getName",getterType);//setter方法MethodTypesetterType=MethodType.methodType(void.class,String.class);MethodHandlesetterHandle=lookup.findVirtual(Person.class,"setName",setterType);//构造方法MethodTypeconstructorType=MethodType.methodType(void.class,String.class,int.class);MethodHandleconstructorHandle=lookup.findConstructor(个人n.class,constructorType);//空间构造方法MethodTypeemptyConstructorType=MethodType.methodType(void.class);MethodHandleemptyConstructorHandle=lookup.findConstructor(Person.class,emptyConstructorType);通过调用创建beanMethodTypeconstructorType=MethodType.methodType(void.class,String.class,int.class);MethodHandleconstructorHandle=lookup.findConstructor(Person.class,constructorType);Personp=(Person)constructorHandle.invoke("雪松",33);System.out.println(p);//输出Person{age=33,name='Xuesong'}MethodTypeemptyConstructorType=MethodType.methodType(void.class);MethodHandleemptyConstructorHandle=lookup.findConstructor(Person.class,emptyConstructorType);Personp2=(Person)emptyConstructorHandle.invoke();System.out.println(p2);//输出Person{age=0,name='null'}通过invoke调用getter和setterMethodHandlenameReader=lookup.findGetter(Person.class,"name",String.class);MethodHandlenameWriter=lookup.findSetter(Person.class,"name",String.class);Personperson=newPerson("雪松",33);Stringname=(String)nameReader.invoke(person);//或//Stringname=(String)getterHandle.invoke(person);System.out.println(name);//输出XuesongnameWriter.invoke(person,"John");////setterHandle.invoke(person,"John");System.out.println(person.getName());//输出Johnfor私有字段需要特殊处理FieldnameField=Person.class.getDeclaredField("name");nameField.setAccessible(true);MethodHandleprivateNameReader=lookup.unreflectGetter(nameField);Stringname=(String)privateNameReader.invoke(person);System.out.println(name);MethodHandleprivateNameWriter=lookup.unreflectSetter(nameField);privateNameWriter.invoke(person,"John");System.out.println(person.getName());//JDK9后的方式LookupprivateLookup=MethodHandles.privateLookupIn(Person.class,lookup);MethodHandleprivateNameWriter=privateLookup.findSetter(Person.class,"name",String.class);privateNameWriter.invoke(person,"John");JDK9增加了线程安全一个VarHandle,也可以处理VarHandlenameVarHandle=MethodHandles.privateLookupIn(Person.class,lookup).findVarHandle(Person.class,"name",String.class);Stringname=(String)nameVarHandle.get(person);Stringname=(String)nameVarHandle.getVolatile(人);

最新推荐
猜你喜欢