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

Java 反射Class,动态加载获取方法和成员变量构造信息,方法反射的基本操作,集合泛型的本质 在清楚了各个大厂的面试重点之后,就能很好的提高你刷题以及面试准备的效率,接下来小编也为大家准备了最新的互联网大厂资料。《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》点击传送门即可获取!2928)]既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新! 阅读详情

相关推荐

JAVA中的反射,什么是反射,怎么理解反射(保姆级、代码、图文讲解)

反射java

zhangfuping123456789的博客 4230

Class获取的相关信息

/** * Class * @author chanxiaoxi *Classjava.lang包中的一个 *该的实例用来封装对象运行时的状态 *当一个被加载切创建对象时,和该相关的一个型为Class的对象就会自动创建 *Class本身不提供构造方法,因此不能使用new运算符和构造方法来创建一个Class对象 *任意对象调用getClass()方法都会回去和该对象相关的...

淮海工学院 缠小溪(Java/C++) 189

自抗扰控制ADRC原理解析及案例应用

ESO的设计通常基于系统动态方程的线性化或近似模型,其输出包括系统状态的估计值和总扰动的估计值。非线性状态误差反馈控制律(Nonlinear State Error Feedback,NLSEF)是ADRC的最后一个环节,负责根据ESO和TD提供的信息生成控制信号。ADRC的另一个重要发展方向是与其他控制策略的融合,如模糊控制、神经网络和自适应控制等,以进一步提高系统的鲁棒性和适应性。ADRC的参数主要包括扩张状态观测器(ESO)的参数和非线性状态误差反馈控制律(NLSEF)的参数。

LIUMAO99的博客 9199

Java 使用反射机制获取内部的方法

的定义如下 public class Parcle{ public int a=10; class Inner{ public void get(){ System.out.println("innerClass"); } } } 1.使用反射获取普通的方法以及成员。 try{ Class parcleClass=Class.forName("src.Parcle"); Constructor con=parcleClass.getConstructor(); O

weixin_47776937的博客 2795

Java之通过Class获取信息

1、获取信息 Class<People> peopleClass = People.class; 2、获取公共的方法,包括继承的公有方法 Method[] methods = peopleClass.getMethods(); 3、找到方法 目的是调用它 methods[i].invoke(people) 4、访问私有方法 peopleClass....

LemonSnm的博客 1592

通过class获取的方法信息

测试: 转载于:https://www.cnblogs.com/hwgok/p/7157949.html

weixin_30641999的博客 233

Java获取名的三种方法,你知道几种?

  之前我们分享过Java高级篇——深入浅出Java加载机制这篇文章,今天来带你了解获取名的三种方法。   获取名的方法   Java获取名的方式主要有以下三种。   getName()返回的是虚拟机里面的class名表现形式。   getCanonicalName()返回的是更容易理解的名表示。   getSimpleName()返回的是的简称。   都有什么区别...

qianfeng_dashuju的博客 7534

java反射应用——从Class获取信息

在获得某个所对应的Class对象之后,程序通过调用Class对象的方法来获得所对应的真实信息,主要通过Class对象的大量的实例方法来实现。 一、获取的构造方法: 1、getConstructor(Class[]  params):返回此Class对象所对应的的指定的public构造方法,params参数是按申明顺序标识该方法参数型的Class对象的一个数组。构造方法的参数型与pa

ghp517826的专栏 934

Java笔记(二十九):反射Class加载过程、通过反射获取结构信息反射调用构造器创建对象、反射访问中的成员

(1)Class也是,因此也继承Object;(2)Class对象不是new出来的,而是系统创建的(加载);具体来说,是通过ClassLoader的loadClass创建(3)对于某个Class对象,在内存中只有一份,因为只加载一次且加载是同步机制,只能有一个线程加载这个;比如,先用new一个对象后,再用反射forName去构建Class型对象,不会再进入ClassLoader的loadClass方法。

欢迎~ 390

Java初学笔记31-【反射:机制、功能、主要)、Class获取 Class 对象的六种方法、加载,通过反射获取的结构信息、通过反射创建对象、访问方法和属性】

Java初学笔记31

爱吃凉拌辣芒果的博客 1235

java class 获取_Java反射机制-Class获取信息

1.什么是Java反射Java反射是指通过一个已知名就可以获取到该的内部信息,如的成员变量,方法,构造函数,而且可以通过反射动态的调用该对象的方法,假设我们有这样一个package com.crazycoder2010.reflect;public class Demo {private String strField;protected Integer intField;public...

weixin_42421824的博客 272

Java反射机制-Class获取信息

<br /><br />1.什么是Java反射?<br />  Java反射是指通过一个已知名就可以获取到该的内部信息,如的成员变量,方法,构造函数,而且可以通过反射动态的调用该对象的方法,假设我们有这样一个<br />package com.crazycoder2010.reflect;<br />public class Demo {<br /> private String strField;<br /> protected Integer intField;<br /> public do

无证程序员 2741

java的动态性的介绍_反射机制_获取class对象的方法_获得信息的方法_day_37;

1.java 的动态性包括:反射机制,动态编译,动态执行JavaScript,动态字节码的操作;2.动态语言:Java可以被称之为  准动态语言;3. reflection :4.Class 这个:5.获得 class 对象的方法:package Test; /** * * 用来测试获取class对象的 * * @author Wang * */ public class S...

qq_38053395的博客 863

自定义注解、反射机制、Java内存分析、Class的常用方法、Class的获得方式、发生的初始化、通过反射动态的创建对象执行方法、setAccessible、反射获取泛型信息反射获取注解信息

反射 代码笔记1、注解2、反射机制2.1 Java反射的优缺点2.2反射相关的常用API3、 Java内存分析3.1 Java内存4、 Class4.1Class的常用方法4.2 Class的获得方式4.3 哪些型可以有Class对象4.4的加载过程4.5 的加载与ClassLoader的理解4.6 发生的初始化4.7、创建运行时的对象4.8动态创建对象执行方法4.9 setAccessible5、性能对比6、反射获取泛型信息7、反射获取注解信息 1、注解 使用@interface自定义注

qq_40835432的博客 729

java中的反射Class加载的内容详解

配置文件:将一个信息存储在一个properties的配置文件中,例如的路径,方法通过配置问价获取Cat信息,如下代码示例,在properties中只能获取Cat信息的String型,无法通过配置文件信息,直接调用和实现Cat中的方法。必须修改java的源码如果使用反射机制,就可以通过修改配置文件,而不需要修改源码就可以调用具体的方法。1.加载,返回Class型的对象cls2.通过cls得到加载的com.hspedu.Cat的对象实例。

2302_80274319的博客 1423

Java学习之旅第三季-10:反射获取信息(一)

Java反射机制主要提供运行时查询和修改程序状态的能力,包括自省(获取信息)和有限度的干预(动态创建对象和调用方法)。核心java.lang.Class,通过三种方式获取Class实例:字面量、Object.getClass()和Class.forName()。反射API位于java.lang.reflect包中,包含Field、Method、Constructor等核心,支持获取结构信息、动态创建对象、调用方法等操作。但Java反射的干预能力有限,无法在运行时修改结构(如添加字段或方法)。

摸鱼的老谭 1054
上一篇: java自定义注解
下一篇: java通过反射Class实例调用对象方法
chenlu4447
博客等级 码龄10年 6粉丝 0原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值