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());
}