• 反射


    package cn.zzsxt.demo;

    import java.lang.reflect.Constructor;
    import java.lang.reflect.Field;
    import java.lang.reflect.Method;
    import java.util.Arrays;

    /**
    *java.lang.Class类:继承了Object类,描述了类的相关信息,是java反射机制的入口。
    *一个类中信息常见的组成:
    *构造函数:无,不能通过new关键创建Class对象,一般通过Class.forName(全类名)获取Class对象;
    *常用方法:
    * getDeclaredFields():返回 Field 对象的一个数组,这些对象反映此 Class 对象所表示的类或接口所声明的所有字段。
    * getDeclaredMethods()
    返回 Method 对象的一个数组,这些对象反映此 Class 对象表示的类或接口声明的所有方法,包括公共、保护、默认(包)访问和私有方法,但不包括继承的方法。
    getDeclaredConstructors()
    返回 Constructor 对象的一个数组,这些对象反映此 Class 对象表示的类声明的所有构造方法
    getModifiers():返回类的修饰符。0代表默认,1代表public
    getSimpleName():返回简单类名,不包含包名。
    getName():返回全类名,包含包名。
    getSuperclass():返回父类类型
    getInterfaces():返回实现的接口类型

    *1.成员变量或属性:Field
    * getModifiers():返回属性的修饰符。0代表默认,1代表public,2代表private,4代表protected
    * getType():返回属性的类型
    * getName():返回属性名称
    *2.成员方法:Method
    * getModifiers():返回方法的修饰符
    * getReturnType():返回方法的返回值类型
    * getName():返回方法名
    * getParameterTypes():返回方法的参数类型
    * getExceptionTypes():返回方法声明的异常类型
    *3.构造方法:Constructor
    * getModifiers():返回构造方法的修饰符
    * getName():返回构造方法名
    * getParameterTypes():返回构造方法的参数类型
    *
    */
    public class TestClass {

    /**
    * 获取类的相关信息
    */
    public void testClassinfo(){
    try {
    Class clazz = Class.forName("cn.zzsxt.entity.Student");
    Package pack =clazz.getPackage();
    System.out.println(pack.getName());
    // String clazzName = clazz.getName(); //包名+类名
    int modify = clazz.getModifiers();//获取类的修饰符
    String simpleName = clazz.getSimpleName();//类名
    Class superClazz = clazz.getSuperclass();//获取父类
    Class[] interfaceClazz = clazz.getInterfaces();//获取实现的接口
    System.out.println("修饰符:"+modify);
    System.out.println("类名:"+simpleName);
    System.out.println("继承的父类:"+superClazz);
    System.out.println("实现的接口:"+Arrays.toString(interfaceClazz));

    } catch (ClassNotFoundException e) {
    e.printStackTrace();
    }

    }
    /**
    * 获取属性信息
    */
    public void testField(){
    try {
    //获取Student对象对应的Class信息
    Class clazz = Class.forName("cn.zzsxt.entity.Student");//动态加载一个类参数应该为该类的全类名(包名+类名)
    Field[] fs = clazz.getDeclaredFields();//获取该类中的属性信息
    for (Field field : fs) {
    int modifer = field.getModifiers();//获取修饰符 1:public,2:private,4:protected 0:默认
    Class fieldClass = field.getType();//获取属性的类型
    String fieldName = field.getName();//获取属性名称
    System.out.println(modifer+"---"+fieldClass+"---"+fieldName);
    }
    } catch (ClassNotFoundException e) {
    e.printStackTrace();
    }
    }
    /**
    * 获取方法信息
    */
    public void testMethod(){
    try {
    Class clazz = Class.forName("cn.zzsxt.entity.Student");//动态加载一个类参数应该为该类的全类名(包名+类名)
    Method[] ms = clazz.getDeclaredMethods();//获取类中的方法信息
    for (Method method : ms) {
    int modify = method.getModifiers();//获取方法的修饰符
    Class returnTypeClass = method.getReturnType();//获取方法的返回值类型
    String methodName = method.getName();//获取方法名
    Class[] paramClazz = method.getParameterTypes();//获取参数类型
    Class[] exceptionClazz = method.getExceptionTypes();//获取异常类型
    System.out.println(modify+"---"+returnTypeClass+"---"+methodName+"---"+Arrays.toString(paramClazz)+"---"+Arrays.toString(exceptionClazz));
    }
    } catch (ClassNotFoundException e) {
    e.printStackTrace();
    }
    }

    /**
    * 获取构造函数
    */
    public void testConstructor(){
    try {
    Class clazz = Class.forName("cn.zzsxt.entity.Student");
    Constructor[] cs= clazz.getConstructors();
    for (Constructor constructor : cs) {
    int modify = constructor.getModifiers();//获取构造函数的修饰符
    String constructorName = constructor.getName();//获取构造函数的名称
    Class[] paramClazz = constructor.getParameterTypes();//获取构造函数的参数
    System.out.println(modify+"---"+constructorName+"---"+Arrays.toString(paramClazz));
    }
    } catch (ClassNotFoundException e) {
    e.printStackTrace();
    }
    }

    public static void main(String[] args) {
    TestClass test = new TestClass();
    test.testClassinfo();
    // test.testField();
    // test.testMethod();
    // test.testConstructor();
    }
    }

    Constructor
    * java.lang.reflect.Constructor类:提供关于类的单个构造方法的信息以及对它的访问权限。
    * getModifies():获取构造函数的修饰符
    * getName():获取构造函数的名称
    * getParameterTypes():获取构造函数的参数类型
    *调用无参构造和有参构造的方式:
    *无参构造:Class.forName(...).newInstance()
    *有参构造:
    *1.获取有参构造方法的Constructor对象
    * Class clazz = Class.forName("cn.zzsxt.entity.Student");
    Constructor constructor = clazz.getDeclaredConstructor(String.class,int.class,double.class
    2.调用newInsatnce(Object...objs)方法创建对象
    Object obj = constructor.newInstance("zhangsan",23,80);
    public class TestConstructor {
    public static void main(String[] args) throws Exception{
    // Student student = new Student();
    // Class.forName("cn.zzsxt.entity.Student").newInstance();//相当于调用无参构造函数创建对象
    // Student student = new Student("zhangsan",23,80);
    Class clazz = Class.forName("cn.zzsxt.entity.Student");
    Constructor constructor = clazz.getDeclaredConstructor(String.class,int.class,double.class);
    Object obj = constructor.newInstance("zhangsan",23,80);
    System.out.println(obj);
    }

    }


    Field
    * java.lang.reflect.Field类:Field提供有关类或接口的单个字段的信息,以及对它的动态访问权限。
    * getName():获取属性名称
    * getType():获取属性类型
    * getModifies():获取修饰符
    * set(Object obj, Object value) 将指定对象变量上此 Field 对象表示的字段设置为指定的新值。
    * get(Object obj) 返回指定对象上此 Field 表示的字段的值。
    public class TestField {
    public static void main(String[] args) throws Exception{
    // Student student = new Student();
    // student.setName("zhangsan");
    // student.getName();
    Class clazz = Class.forName("cn.zzsxt.entity.Student");
    Object obj = clazz.newInstance();
    Field field = clazz.getDeclaredField("name");
    field.setAccessible(true);//设置访问控制,true为可以访问private修饰的属性
    field.set(obj, "zhangsan");//赋值
    System.out.println(field.get(obj));//取值
    }

    }


    Method
    * java.lang.reflect.Method类:Method 提供关于类或接口上单独某个方法(以及如何访问该方法)的信息
    * getModifiers() :获取修饰符
    * getReturnType():获取返回值类型
    * getName():获取方法名
    * getParameterTypes():获取方法的参数列表类型
    * getExceptionTypes():获取异常类型
    *
    * invoke(Object obj, Object... args) ***:对带有指定参数的指定对象调用由此 Method 对象表示的底层方法。
    public class TestMethod {
    public static void main(String[] args) throws Exception{
    // Student student = new Student();
    // student.setName("zhangsan");
    // student.getName();
    Class clazz = Class.forName("cn.zzsxt.entity.Student");
    Object obj = clazz.newInstance();
    Method setterMethod = clazz.getMethod("setName", String.class);
    //回调方法student.setName("zhangsan")
    setterMethod.invoke(obj, "zhangsan");//第一个参数为对象,第二个参数为方法的参数值
    Method getterMethod =clazz.getMethod("getName", null);
    //回调方法:student.getName();
    Object result = getterMethod.invoke(obj, null);
    System.out.println(result);
    }

    }
    *

  • 相关阅读:
    流畅的python,Fluent Python 第十章笔记
    foo
    std140
    android 开发注意事项
    Android ABI
    mac 基本
    build automation software 自动构建工具
    修改环境变量
    hyphenation
    Latency
  • 原文地址:https://www.cnblogs.com/seePoppy/p/6879989.html
Copyright © 2020-2023  润新知