java反射中的T_java反射 之 反射基础

本文介绍了Java反射的基础知识,包括如何获取Class对象、Constructor对象、Field对象和Method对象。通过示例展示了如何使用反射创建对象、访问字段和调用方法,以及如何处理私有成员。此外,还提及了反射在操作注解中的应用。
摘要由CSDN通过智能技术生成

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

packagecom.jalja.org.base.relfect;public classPerson {privateString name;intage;publicString address;publicPerson() {

}privatePerson(String name) {this.name =name;

}

Person(String name,intage) {this.name =name;this.age =age;

}public Person(String name, intage, String address) {this.name =name;this.age =age;this.address =address;

}public voidshow() {

System.out.println("show");

}public voidmethod(String s) {

System.out.println("method " +s);

}public String getString(String s, inti) {return s + "---" +i;

}private voidfunction() {

System.out.println("function");

}

@OverridepublicString toString() {return "Person [name=" + name + ", age=" + age + ", address=" +address+ "]";

}

}

View Code

二、获取类的Class对象

1 public static void getClassObject() throwsClassNotFoundException{2 //方式一:Object的getClass()方法

3 Person person1=newPerson();4 Person person2=newPerson();5 Class c1=person1.getClass();6 Class c2=person2.getClass();7 System.out.println(person1==person2);//false

8 System.out.println(c1==c2);//true 不管JVM内存中有多少个对象,对于字节码文件来说只有一份9 //方式二:数据类型的静态class属性

10 Class c3=Person.class;11 System.out.println(c1==c3);//true12 //方式三:Class 类的静态方法13 //public static Class> forName(String className)throws ClassNotFoundException

14 Class c4=Class.forName("com.jalja.org.base.relfect.Person");15 System.out.println(c1==c4);//true

16 }

三、java.lang.reflect.Constructor:对象并使用Constructor类。

1、获取Constructor对象

//获取Class 对象所表示的类的构造方法

public static void getConstructorTest() throwsException{

Class c4=Class.forName("com.jalja.org.base.relfect.Person");//1、获取Class 对象所表示的类所有公共构造方法//public Constructor>[] getConstructors() throws SecurityException

Constructor [] cs=c4.getConstructors();//2、获取Class 对象所表示的类所有构造方法//public Constructor>[] getDeclaredConstructors() throws SecurityException

Constructor[] cs2 =c4.getDeclaredConstructors();//3、获取Class对象所表示类的指定指定公共构造方法, parameterTypes 参数是 Class 对象的一个数组 ,是指定数据类型的字节码//public Constructor getConstructor(Class>... parameterTypes);

Constructor cs3=c4.getConstructor();//获取公共的无参构造方法的Constructor对象//获取 该 构造函数 public Person(String name, int age, String address)

Constructor cs4=c4.getConstructor(String.class,int.class,String.class);//4、获取Clss对象所表示类指定的构造范法官 parameterTypes 参数是 Class 对象的一个数组,它按声明顺序标识构造方法的形参类型的字节码。//public Constructor getDeclaredConstructor(Class>... parameterTypes);//获取该构造 函数 private Person(String name) 的Constructor对象

Constructor cs5=c4.getDeclaredConstructor(String.class);

}

2、通过 Constructor 对象创建Class对象所表示类的实例

public static void createObject() throwsException{

Class c4=Class.forName("com.jalja.org.base.relfect.Person");//使用此 Constructor 对象表示的构造方法来创建该构造方法的声明类的新实例,并用指定的初始化参数初始化该实例//public T newInstance(Object... initargs);//Person person=new Person()

Constructor cs3=c4.getConstructor();//获取公共的无参构造方法的Constructor对象

Object obj=cs3.newInstance();//Person person=new Person("jalja", 21, "北京");

Constructor cs4=c4.getConstructor(String.class,int.class,String.class);

Object obj1=cs4.newInstance("jalja",21,"北京");

System.out.println(obj1);//Person [name=jalja, age=21, address=北京]//实例化一个私有的构造函数 private Person(String name)//控制java的访问检查//public void setAccessible(boolean flag)//将此对象的 accessible 标志设置为指示的布尔值。值为 true 则指示反射的对象在使用时应该取消 Java 语言访问检查。//值为 false 则指示反射的对象应该实施 Java 语言访问检查。

Constructor cs5=c4.getDeclaredConstructor(String.class);

cs5.setAccessible(true);

Object obj2=cs5.newInstance("张三丰");

System.out.println(obj2);//Person [name=张三丰, age=0, address=null]

}

四、java.lang.reflect.Field

1、获取Field对象

//获取Class类的Field对象

public static void getFieldTest() throwsException{

Class cs=Class.forName("com.jalja.org.base.relfect.Person");//1、public Field[] getFields() throws SecurityException//获取Class 对象所表示的类或接口的所有可访问公共(public修饰的)字段

Field [] fs=cs.getFields();//2、public Field[] getDeclaredFields() throws SecurityException//获取Class 对象所表示的类或接口所声明的所有字段。包括公共、保护、默认(包)访问和私有字段,但不包括继承的字段

Field [] fs1=cs.getDeclaredFields();//3、public Field getField(String name)throws NoSuchFieldException, SecurityException;//获取Class 对象所表示的类或接口的指定公共成员(public修饰)字段。name 参数是一个 String,用于指定所需字段的简称

Field fs2=cs.getField("address");//public Field getDeclaredField(String name) throws NoSuchFieldException,SecurityException//获取 Class 对象所表示的类或接口的指定已声明字段。name 参数是一个 String,它指定所需字段的简称

Field fs3=cs.getDeclaredField("name");

System.out.println(fs3);

}

2、通过Field对象对指定类属性赋值

//使用 Field对象

public static void createVarValue() throwsException{

Class cs=Class.forName("com.jalja.org.base.relfect.Person");

Object obj=cs.getConstructor().newInstance();

Field addressField=cs.getField("address");//public void set(Object obj, Object value);//将指定对象变量上此 Field 对象表示的字段设置为指定的新值。如果底层字段的类型为基本类型,则对新值进行自动解包//obj - 应该修改其字段的对象 value - 正被修改的 obj 的字段的新值

addressField.set(obj, "北京");

System.out.println(obj);//Person [name=null, age=0, address=北京]//对非public修饰的变量操作

Field nameField=cs.getDeclaredField("name");//控制java的访问检查

nameField.setAccessible(true);

nameField.set(obj,"张三丰");

System.out.println(obj);//Person [name=张三丰, age=0, address=北京]

}

五、java.lang.reflect.Method

1、获取Method对象

//获取Method对象

public static void getMethodTest() throwsException{

Class cs=Class.forName("com.jalja.org.base.relfect.Person");//1、public Method[] getMethods() throws SecurityException//获取Class 对象所表示的类或接口(包括那些由该类或接口声明的以及从超类和超接口继承的那些的类或接口)的公共 member 方法。

Method [] m1=cs.getMethods();//2、public Method[] getDeclaredMethods() throws SecurityException//获取Class 对象表示的类或接口声明的所有方法,包括公共、保护、默认(包)访问和私有方法,但不包括继承的方法

Method [] m2=cs.getDeclaredMethods();//3、public Method getMethod(String name, Class>... parameterTypes)throws NoSuchMethodException, SecurityException;//获取Class 对象所表示的类或接口的指定公共成员方法。name 参数是一个 String,用于指定所需方法的简称。parameterTypes 参数是按声明顺序标识该方法形参类型的 Class 对象的一个数组

Method m3=cs.getMethod("show");//无参的方法

Method m4=cs.getMethod("method",String.class);//带参的方法//public Method getDeclaredMethod(String name, Class>... parameterTypes)throws NoSuchMethodException,SecurityException//Class 对象所表示的类或接口的指定已声明方法。name 参数是一个 String,它指定所需方法的简称,parameterTypes 参数是 Class 对象的一个数组

Method m5=cs.getDeclaredMethod("function");//无参的方法

System.out.println(m5);

}

2、通过Method对象调用指定类的方法

//Method对象的使用

public static void createMethod() throwsException{

Class cs=Class.forName("com.jalja.org.base.relfect.Person");

Object obj=cs.getConstructor().newInstance();

Method m3=cs.getMethod("show");//无参的方法//public Object invoke(Object obj,Object... args)//对带有指定参数的指定对象调用由此 Method 对象表示的底层方法 obj - 从中调用底层方法的对象 args - 用于方法调用的参数

m3.invoke(obj);//对带参方法的操作

Method m4=cs.getMethod("method",String.class);//带参的方法

m4.invoke(obj,"北京");//对有返回值得方法操作

Method m6=cs.getMethod("getString",String.class,int.class);//带参的方法

Object str=m6.invoke(obj,"北京",200);

System.out.println(str);//对私有无参方法的操作

Method m5=cs.getDeclaredMethod("function");

m5.setAccessible(true);

m5.invoke(obj);

}

六、反射操作注解

@ClassAnnotation("tb_person")public classPerson {

@FieldAnnotation(name="table_name",length=32,type="varchar")privateString name;

@FieldAnnotation(name="table_age",length=3,type="int")private intage;

@FieldAnnotation(name="table_address",length=32,type="varchar")public String address;

....get;

....set;

}

//注解类

@Target(value={ElementType.FIELD})

@Retention(RetentionPolicy.RUNTIME)public @interfaceFieldAnnotation {

String name();intlength();

String type();

}

//注解类

@Target(value={ElementType.TYPE})

@Retention(RetentionPolicy.RUNTIME)public @interfaceClassAnnotation {

String value();

}

//Annotation

public static void createAnnotation() throwsException{

Class cs=Class.forName("com.jalja.org.base.relfect.Person");//获取该类的所有注解

Annotation[] as=cs.getAnnotations();//获取该类指定类型的注解//@com.jalja.org.base.relfect.ClassAnnotation(value=tb_person)

ClassAnnotation at=(ClassAnnotation) cs.getAnnotation(ClassAnnotation.class);//获取该注解设置的值

String an_value=at.value();//tb_person//获取类 name属性(Field)的注解类型

FieldAnnotation fieldName=cs.getDeclaredField("name").getAnnotation(FieldAnnotation.class);//获取注解值 #table_name--32--varchar

System.out.println(fieldName.name()+"--"+fieldName.length()+"--"+fieldName.type());

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值