Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Appearance settings

iwangbingzhi/JavaReflectTutorial

Open more actions menu

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

24 Commits
24 Commits
 
 
 
 
 
 
 
 

Repository files navigation

反射总结:

获取Class对象有三种方式:

1.使用对象的 getClass() 方法,如var person = new Person;person.getClass();
2.使用 .class,如int.class;Person.class;
3.使用 Class.forName()添加Class对象的路径。如Class.forName("com.google.mybatis");

获取Class对象的相关信息:

1.getName();获取Class对象全限定类名 比如"com.apple.test"
2.getSimpleName();直接获取对象的名字,不包含包名,比如"test"
注:如果是数组类型的话,getName()是在前面加上[, String[].class.getName(); 返回的就是 [Ljava.lang.String (其中的L代表的是在java内部的命名规则中的代表类或者接口的形式,如果是int[]则是返回的[I)
而getSimpleName()是在后面加上对应维度的[]
String[][][].class.getSimpleName(); String[][][]
还有一个 getCanonicalName()返回官方名字,如果官方名字不存在就会返回null(局部类和匿名内部类不存在官方名字)

获取Class对象的修饰符

getModifiers()
public class Test{} Test.class.getModifiers()
此时返回的是一个数(1),在java内部都是通过数字代表着不同的修饰符,此时我们需要通过Modifier.toString()方法把该数值转换成字符串

获取Class对象的属性:(Field)

getDeclaredField(),可以获取到被private修饰的属性,不能从父类获取属性
getField(),可以获取到非private修饰的属性,如果是当前类中不含有该属性,但是有父类存在的话,会从父类中寻找是否存在该属性
getDeclaredFields() ,注意这里多了一个s,该方法的意义在于获取所有的属性,但是不包含从父类继承过来的属性
getFields(),获取自身的所有public修饰的属性,并且包括从父类继承过来的

获取Class对象中的函数:(Method)

getDeclaredMethod(String name, Class<?>... parameterTypes),获取到Class对象中的private修饰的方法,不包括父类(第一个参数方法名,第二个参数填写方法的参数,个数是不定的,根据方法的参数个人来确定,并且传入的参数类型都必须是.class类型的)

//如下所示
Method methodtest = class1.getDeclaredMethod("test",int.class,float.class);
//如果是方法的参数过多可以采取如下形式
Method methodtest = class1.getDeclaredMethod("test",new Class[]{int.class,float.class});

getMethod(String name, Class... parameterTypes),获取到Class对象中的非private修饰的方法,包括父类
getDeclaredMethods() throws SecurityException,获取本Class中的所有方法,不包含从父类继承过来的
getMethod(String name, Class... parameterTypes),获取本Class中的所有Public修饰的方法,包括从父类继承过来的

获取Class对象中的构造函数(Constructor)

public Constructor getDeclaredConstructor(Class... parameterTypes),获取到被private修饰的构造方法
public Constructor getConstructor(Class... parameterTypes),获取到被非private修饰的构造方法
public Constructor[] getDeclaredConstructors() throws SecurityException,获取到所有的构造方法
public Constructor[] getConstructors() throws SecurityException ,获取到被public修饰的构造方法
Constructor 不能从父类继承,所以就没有办法通过 getConstructor() 获取到父类的 Constructor。

Class属性的操作

getGenericType(),获取泛型属性类型
getType(),获取属性类型
getModifiers()获取属性的修饰符
public Object get(Object obj)获得属性的值,参数填写要获取值的对象(该方法有一系列的值在此不多多列举,可以参考官方文档)
public void set(Object obj, Object value);设置属性的值,第一个参数填写设置值的对象,第二个值填写要设置的值
【注:】 如果访问的值是private的,通过get获取值的时候会报错java.lang.IllegalAccessException: Class com.xxx.xxx.xxx can not access a member of class com.xx.xx.x with modifiers "private"
此时只需要添加该代码,boolean值设置为true,即可解决setAccessible(true);

Class中方法:

getName() 获取方法名
public Parameter[] getParameters()获取到方法的参数
public String getName()获取参数名字
public Class getType()获取参数类型
public int getModifiers()获取参数的修饰符
public Class[] getParameterTypes() 获取所有的参数类型
public Type[] getGenericParameterTypes() 获取所有的参数类型,包括泛型
代码操作如下所示

        Class<Car> carClass = Car.class;
        Method[] declaredMethods = carClass.getDeclaredMethods();
        for (Method m: declaredMethods) {
            System.out.println("方法名字:"+m.getName());
            Parameter[] parameters = m.getParameters();
            for (Parameter p:parameters) {
                System.out.println("参数名字:"+p.getName()+"参数类型:"+p.getType());
            }
            Class[] parameterTypes = m.getParameterTypes();
            System.out.println("方法参数类型————————");
            for (Class type:parameterTypes) {
                System.out.println(" "+type.getName());
            }

获取返回值:

public Class<?> getReturnType()获取返回值类型
public Type getGenericReturnType()获取返回值类型包括泛型

        Class<Car> carClass = Car.class;
        Method[] declaredMethods = carClass.getDeclaredMethods();
        for (Method m:declaredMethods) {
            System.out.println("方法的返回值类型:"+m.getReturnType());
            System.out.println("方法的泛型返回值类型:"+m.getGenericReturnType());
        方法的返回值类型:class java.lang.String
        方法的泛型返回值类型:class java.lang.String
        方法的返回值类型:class java.lang.String
        方法的泛型返回值类型:class java.lang.String
        方法的返回值类型:void
        方法的泛型返回值类型:void

public int getModifiers();获取方法修饰符
public Class<?>[] getExceptionTypes() 获取异常类型
public Type[] getGenericExceptionTypes()获取泛型异常类型

方法的调用:

public Object invoke(Object obj, Object... args)
该方法可以执行你通过反射得到的Class对象的方法,第一个Object参数是传入要调用方法的初始化之后的对象,第二个参数传入调用该方法所需要用到的的实际参数,静态方法中第一个参数为空,如果调用的方法不需要传入参数,那么直接为null;

        //测试静态方法的执行
        Method testStatic = testMethodClass.getMethod("testStatic", null);
        try {
            testStatic.invoke(null, null);
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        }
        public class TestMethod {
              private int add (int a,int b ) {
                  return a + b;
              }
              
              

        TestMethod testMethod = new TestMethod();
        //测试有参方法的执行
        Method add = testMethodClass.getDeclaredMethod("add", int.class, int.class);
        add.setAccessible(true);
        int result = 0;
        try {
            result = (int) add.invoke(testMethod, 1, 2);
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        }
        System.out.println("add方法执行的结果result="+result);

。。。。。。。。。。。。。。。。。。。。。。。。。。。。。休息休息一下,未完待续!!

本文档一部分内容来自于 https://blog.csdn.net/briblue/article/details/74616922

About

Java反射部分教程

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors

Languages

Morty Proxy This is a proxified and sanitized view of the page, visit original site.