目录

Java-反射

什么是反射?

反射允许对封装类的字段,方法和构造函数的信息进行编程访问。

获取class对象的三种方式

3种方式的使用场景

全类名获取方法

用反射获取构造方法

java 复制代码
package com.test12;

import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;

public class Test {
    public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException, InstantiationException, IllegalAccessException {
        //获取字节码文件对象clazz
        Class clazz = Class.forName("com.test12.Student");

        //获取public修饰的构造方法;不带Declared只能获取公共的
       /* Constructor[] cons = clazz.getConstructors();
        for (Constructor con : cons) {
            System.out.println(con);
        }*/

        //获取所有的构造方法
       /* Constructor[] cons = clazz.getDeclaredConstructors();
        for (Constructor con : cons) {
            System.out.println(con);
        }*/

        //获取单个构造方法
        //空参类型
        /*Constructor con = clazz.getDeclaredConstructor();
        System.out.println(con);*/

        //String类型
        /*Constructor con = clazz.getDeclaredConstructor(String.class);
        System.out.println(con);*/

        //int类型
        /*Constructor con = clazz.getDeclaredConstructor(int.class);
        System.out.println(con);*/

        //多参类型
        Constructor con = clazz.getDeclaredConstructor(String.class,int.class);
        
        //获取构造方法的权限修饰符
        int modifiers = con.getModifiers();

        //获取构造方法的参数
        /*Parameter[] parameters = con.getParameters();
        for (Parameter parameter : parameters) {
            System.out.println(parameter);
        }*/

        //暴力反射:临时取消权限校验
        con.setAccessible(true);
        //根据获取的构造方法创建对象
        Student stu = (Student) con.newInstance("zhangsan", 23);
        System.out.println(stu);
    }
}

用反射获取成员变量

用反射获取成员方法

java 复制代码
package com.test12;

import java.io.IOException;

public class Student {

    private String name;
    private int age;

    public Student() {
    }

    public Student(String name) {
        this.name = name;
    }

    protected Student(int age) {
        this.age = age;
    }

    private Student(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    private String eat(String name) throws IOException,NullPointerException,ClassCastException {
        System.out.println(name + "在吃东西");
        return "hahaha";
    }

    private void eat(String name, int a){
        System.out.println(name + "在吃东西");
    }
    @Override
    public String toString() {
        return "Student{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}
java 复制代码
package com.test12;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.lang.reflect.Parameter;

public class Test2 {
    public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException, IllegalAccessException {

        Class clazz = Class.forName("com.test12.Student");

        //获取所有的公共方法对象(包括父类里的方法对象)
        /*Method[] methods = clazz.getMethods();
        for (Method method : methods) {
            System.out.println(method);
        }*/
        //获取所有方法对象(不包括父类里的)
        /*Method[] methods = clazz.getDeclaredMethods();
        for (Method method : methods) {
            System.out.println(method);
        }*/
        //获取单个方法对象
        //空参方法
        /*Method m = clazz.getDeclaredMethod("toString");
        System.out.println(m);*/
        //单参方法
        Method m = clazz.getDeclaredMethod("eat", String.class);
        System.out.println(m);
        //多参方法
        /*Method m = clazz.getDeclaredMethod("eat", String.class,int.class);
        System.out.println(m);*/
        //获取方法的权限修饰符
        int modifiers = m.getModifiers();
        System.out.println(modifiers);
        //获取方法的名字
        String name = m.getName();
        System.out.println(name);
        //获取方法的参数
        Parameter[] parameters = m.getParameters();
        for (Parameter parameter : parameters) {
            System.out.println(parameter);
        }
        //获取方法的抛出异常
        Class[] exceptionTypes = m.getExceptionTypes();
        for (Class exceptionType : exceptionTypes) {
            System.out.println(exceptionType);
        }
        //方法运行
        Student s = new Student();
        //无返回值类型方法
        /*m.setAccessible(true);
        m.invoke(s,"zhangsan");*/
        //有返回值类型方法
        m.setAccessible(true);
        String result = (String) m.invoke(s,"zhangsan");
        System.out.println(result);
    }
}
本文是转载文章,点击查看原文
如有侵权,请联系 xyy@jishuzhan.net 删除
相关推荐
矛取矛求20 分钟前
C++ 标准库参考手册深度解析
java·开发语言·c++
cijiancao21 分钟前
23 种设计模式中的解释器模式
java·设计模式·解释器模式
南七行者24 分钟前
对模板方法模式的理解
java·设计模式·模板方法
٩( 'ω' )و26028 分钟前
stl_list的模拟实现
开发语言·c++·list
麻芝汤圆1 小时前
MapReduce 的广泛应用:从数据处理到智能决策
java·开发语言·前端·hadoop·后端·servlet·mapreduce
努力的搬砖人.1 小时前
java如何实现一个秒杀系统(原理)
java·经验分享·后端·面试
珊瑚里的鱼1 小时前
第五讲(下)| string类的模拟实现
开发语言·c++·笔记·程序人生·算法·visualstudio·visual studio
哈哈哈哈哈哈哈哈哈...........1 小时前
【java】在 Java 中,获取一个类的`Class`对象有多种方式
java·开发语言·python
@小白向前冲1 小时前
python 重要易忘 语言基础
开发语言·python
fallwind_of_july1 小时前
java项目分享-分布式电商项目附软件链接
java·redis·分布式·mongodb·elasticsearch·微服务·rabbitmq