zoukankan      html  css  js  c++  java
  • 反射

    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);
    }

    }
    *

  • 相关阅读:
    Write an algorithm such that if an element in an MxN matrix is 0, its entire row and column is set to 0.
    旋转二维数组
    replace empty char with new string,unsafe method和native implementation的性能比较
    判断一字符串是否可以另一字符串重新排列而成
    移除重复字符的几个算法简单比较
    也来纠结一下字符串翻转
    判断重复字符存在:更有意义一点
    程序员常去网站汇总
    sublime
    针对程序集 'SqlServerTime' 的 ALTER ASSEMBLY 失败,因为程序集 'SqlServerTime' 未获授权(PERMISSION_SET = EXTERNAL_ACCESS)
  • 原文地址:https://www.cnblogs.com/seePoppy/p/6879989.html
Copyright © 2011-2022 走看看