首页 > 编程语言 >java 反射

java 反射

时间:2023-03-10 22:46:41浏览次数:31  
标签:反射 java name Class 获取 declaredConstructor c1 public

反射

1. 获取类对象的三种方法

public static void method2() throws ClassNotFoundException {
        //获取类对象方法 1
        Class<Monkey> c1 = Monkey.class;
        //获取类对象方法 2
        Monkey class2 = new Monkey();
        Class<? extends Monkey> c2 = class2.getClass();
        //获取类对象方法 3
        Class<?> c3 = Class.forName("com.deu.javasm.day0310.Monkey");
    }

2. 获取构造器

public static void method3() throws ClassNotFoundException, NoSuchMethodException {
        Class<?> c1 = Class.forName("com.deu.javasm.day0310.Monkey");
        //获取Public修饰的构造器
        Constructor<?>[] constructors = c1.getConstructors();
        //获取某个指定public修饰的构造器
        Constructor<?> constructor = c1.getConstructor();
        //获取所有的构造器包含private
        Constructor<?>[] declaredConstructors = c1.getDeclaredConstructors();
        //获取某个指定的构造器
        Constructor<?> declaredConstructor = c1.getDeclaredConstructor();
    }

3. 用反射操作构造器,创建对象

public static void method4() throws ClassNotFoundException, NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException {
        //获取类对象
        Class<?> c1 = Class.forName("com.deu.javasm.day0310.Monkey");
        //获取构造器
        Constructor<?> declaredConstructor = c1.getDeclaredConstructor();
        //创建对象(访问权限)
        declaredConstructor.setAccessible(true);
        Object o = declaredConstructor.newInstance();
        System.out.println(o);
    }

4. 使用反射操作成员变量

public static void method5() throws ClassNotFoundException, NoSuchFieldException, IllegalAccessException, InstantiationException, NoSuchMethodException, InvocationTargetException {
        //获取类对象
        Class<?> c1 = Class.forName("com.deu.javasm.day0310.Monkey");
        //获取指定的成员变量
        Field field = c1.getField("name");
        //获取所有public修饰的成员变量(包括从父类继承的)
        Field[] fields = c1.getFields();
        //获取定的成员变量(不管什么权限修饰的)(不包含父类继承的)
        Field declaredField = c1.getDeclaredField("name");
        //获取所有public修饰的成员变量(不管什么权限修饰的)(不包含父类继承的)
        Field[] declaredFields = c1.getDeclaredFields();
        //创建对象
        Constructor<?> declaredConstructor = c1.getDeclaredConstructor();
        Object o = declaredConstructor.newInstance();
        //赋值
        declaredField.setAccessible(true);
        declaredField.set(o, "houzi");
        System.out.println(o);
    }

5. 使用反射 操作方法 调用方法

public static void method6() throws ClassNotFoundException, NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException {
        //获取类对象
        Class<?> c1 = Class.forName("com.deu.javasm.day0310.Monkey");
        //获取指定的方法 包括父类继承的
        Method method = c1.getMethod("name",String.class);
        //获取所有public修饰的方法 包括父类继承的
        Method[] methods = c1.getMethods();
        //获取指定的方法  (不管什么权限修饰符;不包含继承的)
        Method name = c1.getDeclaredMethod("name", String.class);
        //获取所有的方法  (不管什么权限修饰符;不包含继承的)
        Method[] declaredMethods = c1.getDeclaredMethods();
        //创建对象
        Constructor<?> declaredConstructor = c1.getDeclaredConstructor();
        Object o = declaredConstructor.newInstance();
        //方法调用
        name.setAccessible(true);
        name.invoke(o,"houzi");
        //有关静态方法的调用
        Method name1 = c1.getDeclaredMethod("name", String.class);
        name1.invoke(null,"houzi");
    }

标签:反射,java,name,Class,获取,declaredConstructor,c1,public
From: https://www.cnblogs.com/jh0129/p/17204870.html

相关文章

  • 1_认识JAVAWEB项目结构
    -project项目的根目录-静态资源文件/jsp-WEB-INF受保护的资源目录     -libjar包目录     -classesjava字节码目录     -web.xml项目的配置......
  • 1_认识JAVAWEB项目结构
    -project项目的根目录-静态资源文件/jsp-WEB-INF受保护的资源目录     -libjar包目录     -classesjava字节码目录     -web.xml项目的配置......
  • 1_认识JAVAWEB项目结构
    -project项目的根目录-静态资源文件/jsp-WEB-INF受保护的资源目录     -libjar包目录     -classesjava字节码目录     -web.xml项目......
  • 1_认识JAVAWEB项目结构
    -project项目的根目录-静态资源文件/jsp-WEB-INF受保护的资源目录     -libjar包目录     -classesjava字节码目录     -web.xml项目......
  • 2023-03-10 Java中使用ArrayDeque实现栈和队列
    栈和队列的实现实际上完全可以用JDK自带的类ArrayDeque来实现作为队列使用publicabstractbooleanadd(EparamE);//加入元素到队尾publicabstractbooleanoffe......
  • JAVA多线程处理大量数据(二)--推荐
    背景说明:要对服务器上一个目录进行全量文件读取1、多线程执行类--FileThreadUtils.javaimportcn.hutool.core.collection.CollUtil;importcn.hutool.core.io.FileUti......
  • Java对象List<对象>转JSON的异常
    @Data@Accessors(fluent=true)publicclassA{privateStringid;privateList<B>b;}@Data@Accessors(fluent=true)publicclassB{privateS......
  • JDBC--java连接数据库
    什么是JDBCJDBC(javadatabase.connective)它是一套用于执行SQL语句的JavaAPI,可以为多种关系数据库提供统一访问,它由一组用Java语言编写的类和接口组成。JDBC提供了一种规......
  • Java中的IO
    1、概念IO(Input、Output)表示输入与输出。Java1.0中IO是流式IO,只能一个个字节的处理数据,所以也叫StreamIO,其响应是阻塞式的。Java1.4中的NIO(non-blocking)是非阻塞式......
  • java-IO-字节流读数据(一次读一个字节数组数据)
         ......