java通过反射Class类获取类信息

一、获取类的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();
		}
	}
}

            

转载于:https://my.oschina.net/zhaomin/blog/884730

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值