一、获取类的Class对象
因为Class类是所有类的实例,我们需要先获取类的Class实例,个人理解,之所以称为反射,在一定层面上,是通过Class实例来获取类的信息。获取类的Class实例有如下三种方法
//1,通过实例化对象调用java.lang.Object类的getClass()方法获取
User user = new User();
System.out.println(user.getClass());//class com.test.reflection.User
//2,通过全类名来获取,如:class com.test.reflection.User
System.out.println(com.test.reflection.User.class);//
//3,通过java.lang.Class类的forName(),方法获取
Class<?> forName = Class.forName("com.test.reflection.User");
System.out.println(forName);
package com.test.reflection;
public class TestReflection {
public static void main(String[] args) throws ClassNotFoundException {
//1,通过实例化对象调用java.lang.Object类的getClass()方法获取
User user = new User();
System.out.println(user.getClass());//class com.test.reflection.User
//2,通过全类名来获取,如:class com.test.reflection.User
System.out.println(com.test.reflection.User.class);//
//3,通过java.lang.Class类的forName(),方法获取
Class<?> forName = Class.forName("com.test.reflection.User");
System.out.println(forName);
}
}
二、通过类的Class实例来获取类信息
/**
* 1,获取类名
*/
//getName():获取全类名
System.out.println(clazz.getName());
//com.test.reflection.User
//getSimpleName():获取类名(不包括包名)
System.out.println(clazz.getSimpleName());
//User
//getCanonicalName():返回底层的规范名称,对于普通类和getName没区别,内部类或array有区别
System.out.println(clazz.getCanonicalName());
//com.test.reflection.User
/**
* 1.1 类注解的获取
*/
//getAnnotation():获取类的指定注解
Annotation annotation = clazz.getAnnotation(MyTable.class);
System.out.println("指定类注解"+annotation);
//getAnnotations():获取类的所有注解
Annotation[] annotations = clazz.getAnnotations();
for(Annotation a:annotations){
System.out.println("所有类注解"+a);
}
//返回直接存在于此元素上的所有注释,不包括继承的注解
Annotation[] aaa = clazz.getDeclaredAnnotations();
for(Annotation aasa:aaa){
System.out.println(aasa);
}
/**
* 2,属性的获取
*/
//getField:获取public修饰的制定属性,包括从父类继承的属性,
//没找到会抛出NoSuchFieldException
System.out.println(clazz.getField("love"));
//getFields:获取public修饰的属性,包括从父类继承的属性
Field[] fields = clazz.getFields();
for(Field f: fields){
System.out.println(f);
}
//getDeclaredField():获取类所有所有修饰范围的制定属性属性
Field declaredField = clazz.getDeclaredField("name");
System.out.println(declaredField);
//getDeclaredFields():获取类所有的属性
Field[] declaredFields = clazz.getDeclaredFields();
for(Field df:declaredFields){
System.out.println(df);
}
/**
* 2.1属性注解的获取
*/
//getAnnotation():获取该属性的指定注解
MyField myField = declaredField.getAnnotation(MyField.class);
System.out.println(myField);
//2.1.1获取注解的值
System.out.println(myField.field());
//getAnnotations():获取该属性所有注解
Annotation[] annotations2 = declaredField.getAnnotations();
for(Annotation a2:annotations2 ){
System.out.println(a2);
}
//获取该属性所有注解,不包括继承的注解
Annotation[] declaredAnnotations = declaredField.getDeclaredAnnotations();
for(Annotation das2:declaredAnnotations){
System.out.println(das2);
}
//
/**
* 3,方法的获取
*/
//getMethod():制定public方法的获取,第一个参数为方法名,
//第二个为方法参数类型,没找到会抛出NoSuchMethodException
Method method = clazz.getMethod("setName", String.class);
System.out.println(method);
//com.test.reflection.User.setName(java.lang.String)
//getMethods():返回所有public修饰的方法,包括父类中的方法
Method[] methods = clazz.getMethods();
for(Method m:methods){
System.out.println(m);
}
//getDeclaredMethod():返回所有修饰范围的指定方法
Method love = clazz.getDeclaredMethod("love",String.class);
System.out.println(love);
//getDeclaredMethods():返回所有关键词修饰的方法
Method[] declaredMethods = clazz.getDeclaredMethods();
for(Method dm:declaredMethods){
System.err.println(dm);
}
/**
* 3.1 获取方法的注解
*/
//getAnnotation()://获取方法的指定注解
MyMothed mothedAnnotation2 = method.getAnnotation(MyMothed.class);
System.out.println(mothedAnnotation2);
//获取方法注解的值
System.out.println(mothedAnnotation2.value());
//getAnnotations():获取方法的所有注解
Annotation[] annotations3 = method.getAnnotations();
for(Annotation a3:annotations3){
System.out.println("+++++++++++"+a3);
}
//getDeclaredAnnotations():获取方法的所有注解不包括继承的注解
Annotation[] declaredAnnotations2 = method.getDeclaredAnnotations();
for(Annotation da2:declaredAnnotations2){
System.out.println(da2);
}
//获取方法默认值
System.out.println("获取方法默认值"+method.getDefaultValue());
/**
* 3.2 获取方法的参数
*/
//getParameterTypes():获取方法所有参数类型
Class<?>[] parameterTypes = method.getParameterTypes();
for(Class<?> type:parameterTypes){
System.out.println("获取方法所有参数类型"+type);
//获取方法所有参数类型class java.lang.String
//获取方法所有参数类型int
}
//getGenericParameterTypes():获取泛型参数类型
Type[] genericParameterTypes = method.getGenericParameterTypes();
for(Type t: genericParameterTypes){
System.out.println(t);
//class java.lang.String
//int
}
//getParameterAnnotations():获取方法参数所有注解
Annotation[][] pas = method.getParameterAnnotations();
for(Annotation[] p:pas){
for(Annotation s:p){
System.out.println(s);
//@com.test.annotation.MyParam(value=敏敏特穆尔)
}
}
/**
* 4,构造函数的获取
*/
//getConstructor():获取,public修饰的构造函数
Constructor constructor = clazz.getConstructor();
System.out.println(constructor);
//com.test.reflection.User()
//constructors():获取,public修饰的构造函数
Constructor[] constructors = clazz.getConstructors();
for(Constructor c:constructors){
System.out.println(c);
}
//getDeclaredConstructor():返回所有关键词修饰的指定构造方法,参数为空时,访问无参构造
Constructor declaredConstructor = clazz.getDeclaredConstructor();
System.out.println(declaredConstructor);
//getDeclaredConstructors():返回所有关键词修饰的所有构造方法,参数为空时,访问无参构造
Constructor[] declaredConstructors = clazz.getDeclaredConstructors();
for(Constructor dc:declaredConstructors){
System.out.println(dc);
}
package com.test.reflection;
import java.lang.annotation.Annotation;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.lang.reflect.Type;
import com.test.annotation.MyField;
import com.test.annotation.MyMothed;
import com.test.annotation.MyParam;
import com.test.annotation.MyTable;
@SuppressWarnings("all")
public class TestReflection01 {
public static void main(String[] args) throws NoSuchFieldException, SecurityException, NoSuchMethodException {
try {
Class clazz=Class.forName("com.test.reflection.User");
/**
* 1,获取类名
*/
//getName():获取全类名
System.out.println(clazz.getName());
//com.test.reflection.User
//getSimpleName():获取类名(不包括包名)
System.out.println(clazz.getSimpleName());
//User
//getCanonicalName():返回底层的规范名称,对于普通类和getName没区别,内部类或array有区别
System.out.println(clazz.getCanonicalName());
//com.test.reflection.User
/**
* 1.1 类注解的获取
*/
//getAnnotation():获取类的指定注解
Annotation annotation = clazz.getAnnotation(MyTable.class);
System.out.println("指定类注解"+annotation);
//getAnnotations():获取类的所有注解
Annotation[] annotations = clazz.getAnnotations();
for(Annotation a:annotations){
System.out.println("所有类注解"+a);
}
//返回直接存在于此元素上的所有注释,不包括继承的注解
Annotation[] aaa = clazz.getDeclaredAnnotations();
for(Annotation aasa:aaa){
System.out.println(aasa);
}
/**
* 2,属性的获取
*/
//getField:获取public修饰的制定属性,包括从父类继承的属性,没找到会抛出NoSuchFieldException
System.out.println(clazz.getField("love"));
//getFields:获取public修饰的属性,包括从父类继承的属性
Field[] fields = clazz.getFields();
for(Field f: fields){
System.out.println(f);
}
//getDeclaredField():获取类所有所有修饰范围的制定属性属性
Field declaredField = clazz.getDeclaredField("name");
System.out.println(declaredField);
//getDeclaredFields():获取类所有的属性
Field[] declaredFields = clazz.getDeclaredFields();
for(Field df:declaredFields){
System.out.println(df);
}
/**
* 2.1属性注解的获取
*/
//getAnnotation():获取该属性的指定注解
MyField myField = declaredField.getAnnotation(MyField.class);
System.out.println(myField);
//2.1.1获取注解的值
System.out.println(myField.field());
//getAnnotations():获取该属性所有注解
Annotation[] annotations2 = declaredField.getAnnotations();
for(Annotation a2:annotations2 ){
System.out.println(a2);
}
//获取该属性所有注解,不包括继承的注解
Annotation[] declaredAnnotations = declaredField.getDeclaredAnnotations();
for(Annotation das2:declaredAnnotations){
System.out.println(das2);
}
//
/**
* 3,方法的获取
*/
//getMethod():制定public方法的获取,第一个参数为方法名,
//第二个为方法参数类型,没找到会抛出NoSuchMethodException
Method method = clazz.getMethod("setName", String.class);
System.out.println(method);
//com.test.reflection.User.setName(java.lang.String)
//getMethods():返回所有public修饰的方法,包括父类中的方法
Method[] methods = clazz.getMethods();
for(Method m:methods){
System.out.println(m);
}
//getDeclaredMethod():返回所有修饰范围的指定方法
Method love = clazz.getDeclaredMethod("love",String.class);
System.out.println(love);
//getDeclaredMethods():返回所有关键词修饰的方法
Method[] declaredMethods = clazz.getDeclaredMethods();
for(Method dm:declaredMethods){
System.err.println(dm);
}
/**
* 3.1 获取方法的注解
*/
//getAnnotation()://获取方法的指定注解
MyMothed mothedAnnotation2 = method.getAnnotation(MyMothed.class);
System.out.println(mothedAnnotation2);
//获取方法注解的值
System.out.println(mothedAnnotation2.value());
//getAnnotations():获取方法的所有注解
Annotation[] annotations3 = method.getAnnotations();
for(Annotation a3:annotations3){
System.out.println("+++++++++++"+a3);
}
//getDeclaredAnnotations():获取方法的所有注解不包括继承的注解
Annotation[] declaredAnnotations2 = method.getDeclaredAnnotations();
for(Annotation da2:declaredAnnotations2){
System.out.println(da2);
}
//获取方法默认值
System.out.println("获取方法默认值"+method.getDefaultValue());
/**
* 3.2 获取方法的参数
*/
//getParameterTypes():获取方法所有参数类型
Class<?>[] parameterTypes = method.getParameterTypes();
for(Class<?> type:parameterTypes){
System.out.println("获取方法所有参数类型"+type);
//获取方法所有参数类型class java.lang.String
//获取方法所有参数类型int
}
//getGenericParameterTypes():获取泛型参数类型
Type[] genericParameterTypes = method.getGenericParameterTypes();
for(Type t: genericParameterTypes){
System.out.println(t);
//class java.lang.String
//int
}
//getParameterAnnotations():获取方法参数所有注解
Annotation[][] pas = method.getParameterAnnotations();
for(Annotation[] p:pas){
for(Annotation s:p){
System.out.println(s);
//@com.test.annotation.MyParam(value=敏敏特穆尔)
}
}
/**
* 4,构造函数的获取
*/
//getConstructor():获取,public修饰的构造函数
Constructor constructor = clazz.getConstructor();
System.out.println(constructor);
//com.test.reflection.User()
//constructors():获取,public修饰的构造函数
Constructor[] constructors = clazz.getConstructors();
for(Constructor c:constructors){
System.out.println(c);
}
//getDeclaredConstructor():返回所有关键词修饰的指定构造方法,参数为空时,访问无参构造
Constructor declaredConstructor = clazz.getDeclaredConstructor();
System.out.println(declaredConstructor);
//getDeclaredConstructors():返回所有关键词修饰的所有构造方法,参数为空时,访问无参构造
Constructor[] declaredConstructors = clazz.getDeclaredConstructors();
for(Constructor dc:declaredConstructors){
System.out.println(dc);
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
}