Java反射机制学习笔记(1)

Java反射机制学习笔记

1.什么是Java反射

反射是指可以分析一个类的功能的程序。

2.反射的原理

    java运行时系统在程序运行时,需要识别程序中的对象,于是会为每个对象提供一个表示信息,

来区别对象所属的类型,这个标识信息保存了类的相关信息。于是Java提供了一个类用来存储这些信息,他就是Class类。

获取对象的Class类有三种方法。

		①getClass()方法
		例子:
		String s="abc";
		Class c=s.getClass();//这里的c就包含了String类型的相关信息。
		通过c.getName()方法可以获取String类型的名字。
		②Class.forName()方法
		如:Class c=Class.forName("java.time.LocalDate");
		③class属性
		Class c=String.class;

3.前面说了反射的概念,下面来看实用。

**一.**记住几个重要的方法
首先先记住4个类,Class,Constructor(构造器类),Field(域类),Method(方法类),Modifier(修饰符类);
①**Class的方法,你需要记住下面8个,很重要。**
方法 描述
Field[] getFields() 获取所有公有域(包括继承得到的公有域),并返回Field数组,如果是基础数据类型或数组类型或没有域,返回大小为0的数组。
Filed[] getDeclaredFie1ds() 获取类的所有域(包括继承得到的),并返回Field数组如果是基础数据类型或数组类型或没有域,返回大小为0的数组。
Method[] getMethods() 获取所有公有方法(包括继承得到的),并返回Method数组
Method[] getDeclareMethods() 获取类或接口的所有公有方法(不包括继承得到的),并返回Method数组
Constructor[] getConstructors() 类的所有公有构造器
Constructor[] getDeclaredConstructors() 类的所有构造器
int getModifiers( ) 返回的整型数值。
String getName( ) 返冋类名字符串。

Constructor,Field,Method的方法

方法 描述
Class[] getExceptionTypes ( ) 在 Constructor 和 Method 类 中返回一个用于描述方法抛出的异常类型的 Class 对象数组。
int getModifiers( ) 返回一个用于描述构造器、 方法或域的修饰符的整型数值。
String getName( ) 返冋一个用于描述构造器、 方法或域名的字符串。
Class[] getParameterTypes ( ) 在 Constructor 和 Method类中返回一个用于描述参数类型的 Class 对象数组。
Class getReturnType( ) 在 Method 类 中返回一个用于描述返回类型的 Class 对象。

③Modifier的方法,很多,我下面讲代码是用到的方法有这个

方法 描述
static String toString(int modifiers ) 返回对应 modifiers 中位设置的修饰符的字符串表示。

就是上面的Class与其他三个类的getModifiers方法返回的值放到这可以返回它们对应的名字。

**二.**代码实战
package ReflectTest;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
import java.util.Scanner;
public class ReflectTest {
    static Class cL;//本类
   static Class supercl;//父类

    public static void main(String[] args) {
        String ClassName = "";//接收类名
        try {
            if(args.length>0)
            {
                ClassName=args[0];
                cL = Class.forName(ClassName);
                supercl = cL.getSuperclass();
            }
            else
            {
                Scanner scan = new Scanner(System.in);
                ClassName =  scan.next();
                cL=Class.forName(ClassName);
                supercl = cL.getSuperclass();
            }
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
        String modifier = Modifier.toString(cL.getModifiers());
        if(modifier.length()>0)
        System.out.print(modifier+" ");
        System.out.print("class"+" "+ClassName+" ");
        if(supercl.getName().length()>0&&supercl!=Object.class)
            System.out.print("extends"+" "+ supercl.getName());
        System.out.println("{"+"\n");
        printConstructors(cL);
        System.out.println();
        printMethods(cL);
        System.out.println();
        printFields(cL);
        System.out.println("}");
    }
    static void  printConstructors(Class c){
        Constructor[] cons = c.getDeclaredConstructors();
        for (Constructor con : cons ) {
            String modifierWords = Modifier.toString(con.getModifiers());
            if(modifierWords.length()>0)
            {
                System.out.print(modifierWords+" ");
            }
            System.out.print(con.getName()+"(");
            Class[] css = con.getParameterTypes();
            for(int i=0;i<css.length;i++)
            {
                if(i>0)
                System.out.print(","+css[i].getName());
                else
                System.out.print(css[i].getName());
            }
            System.out.println(")"+";");
        }

    }
    static  void  printMethods(Class c)
    {
        Method[] methods = c.getDeclaredMethods();
        for(Method method : methods)
        {
            Class[] types = method.getParameterTypes();
            System.out.print(Modifier.toString(method.getModifiers())+" "+method.getReturnType().getName()+" "+method.getName()+"(");
            for(int i=0;i<types.length;i++)
            {
                if(i>0)
                    System.out.print(","+types[i].getName());
                else
                    System.out.print(types[i].getName());
            }
            System.out.println(")"+";");
        }

    }
    static  void  printFields(Class c)
    {
      Field[] fields = c.getFields();
      for(Field field : fields)
      {
          System.out.print(field.getType().getName()+" "+field.getName()+";");
          System.out.println();
      }
    }
}

下面是结果在这里插入图片描述
在这里插入图片描述


发布了22 篇原创文章 · 获赞 0 · 访问量 600

猜你喜欢

转载自blog.csdn.net/qq_44932835/article/details/104187794