首页 > 编程语言 >javase复习day35反射

javase复习day35反射

时间:2024-09-26 19:50:32浏览次数:3  
标签:String age day35 name Student println javase public 复习

反射

获取class对象的方法 

public class Demo1 {
    public static void main(String[] args) throws ClassNotFoundException {
        //获取反射的三种方式


        //第一种 Class.forName(全类名)
        //用法:最为常用
        Class<?> clazz1 = Class.forName("Reflection.Student");
//        System.out.println(clazz1);// class Reflection.Student
        //第二种
        //一般是当做 参数进行传递
        Class<Student> clazz2 = Student.class;
        System.out.println(clazz2==clazz1);//true

        //第三种
        //在有这个对象时使用
        Student s = new Student();
        Class<? extends Student> clazz3 = s.getClass();
        System.out.println(clazz3==clazz2);//true

    }
}

通过class获取构造方法,成员方法,成员变量

利用反射获取构造方法

public class Demo {
    public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException, InstantiationException, IllegalAccessException {
        //获取class对象
        Class<?> clazz = Class.forName("Reflection.Demo2.Student");
        //通过class对象获取构造方法对象
        //获取非私用的构造方法集合
//        Constructor<?>[] cons1 = clazz.getConstructors();
//        /**
//         * public Reflection.Demo2.Student()
//         * public Reflection.Demo2.Student(java.lang.String)
//         */
//        for (Constructor<?> constructor : cons1) {
//            System.out.println(constructor);
//        }
        
        
        //获取全部构造方法集合(包括私有构造)
//        Constructor<?>[] cons2 = clazz.getDeclaredConstructors();
//        /**
//         * public Reflection.Demo2.Student()
//         * public Reflection.Demo2.Student(java.lang.String)
//         * protected Reflection.Demo2.Student(int)
//         * private Reflection.Demo2.Student(java.lang.String,int)
//         */
//        for (Constructor<?> constructor : cons2) {
//            System.out.println(constructor);
//        }
        
        
//        //获取单个非私有构造方法(通过形参确定哪个构造方法)
//        Constructor<?> con3 = clazz.getConstructor(String.class);
//        //public Reflection.Demo2.Student(java.lang.String)
//        System.out.println(con3);
        
        
//        //使用公开权限获取非公开会报错
//        Constructor<?> con4 = clazz.getConstructor(int.class);
//        /**
//         * Exception in thread "main" java.lang.NoSuchMethodException: Reflection.Demo2.Student.<init>(int)
//         * 	at java.base/java.lang.Class.getConstructor0(Class.java:3585)
//         * 	at java.base/java.lang.Class.getConstructor(Class.java:2271)
//         * 	at Reflection.Demo2.Demo.main(Demo.java:35)
//         */
//        System.out.println(con4);
        
        
//        Constructor<?> con5 = clazz.getDeclaredConstructor(int.class);
//        //protected Reflection.Demo2.Student(int)
//        System.out.println(con5);
        
        
        Constructor<?> con6 = clazz.getDeclaredConstructor(String.class,int.class);
        //private Reflection.Demo2.Student(java.lang.String,int)
//        System.out.println(con6);
        
        
//        //通过构造方法获取修饰符,修饰符使用Int类型的数据进行指代,私有使用2表述
//        int modifiers = con6.getModifiers();
//        System.out.println(modifiers);// 2
        
        
//        //通过构造方法获取形参
//        //获取这个构造方法所有的参数
//        Parameter[] parameters = con6.getParameters();
//        //java.lang.String arg0
//        //int arg1
//        for (Parameter parameter : parameters) {
//            System.out.println(parameter);
//        }
        
        
//        //获取这个构造方法所有参数的个数
//        System.out.println(con6.getParameterCount());//2
        
        
//        //获取这个构造方法所有参数的类型
//        Class<?>[] parameterTypes = con6.getParameterTypes();
//        /**
//         * class java.lang.String
//         * int
//         */
//        for (Class<?> parameterType : parameterTypes) {
//            System.out.println(parameterType);
//        }

//        //通过构造方法获取名字
//        System.out.println(con6.getName());//Reflection.Demo2.Student


        //通过构造方法获取对象
        //表述临时取消权限校验
        con6.setAccessible(true);
        //由于获取的构造方法为私有所以无法创建对象,但是使用上面的临时取消权限校验,可以使这个构造方法创建对象
        //这种方法叫暴力反射
        Student s = (Student) con6.newInstance("zhangsan", 18);
        System.out.println(s.toString());// Student{name = zhangsan, age = 18}

    }
}
public class Student {
    private String name;
    private int age;

    public Student() {
    }

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

利用反射获取成员变量

public class Demo3 {
    public static void main(String[] args) throws ClassNotFoundException, NoSuchFieldException, IllegalAccessException {
        //获取class对象
        Class<?> clazz = Class.forName("Reflection.Demo3.Student");

//        Field[] fields = clazz.getFields();
//        //由于不是获取全部只获取到了公开的
//        //public java.lang.String Reflection.Demo3.Student.gender
//        for (Field f : fields) {
//            System.out.println(f);
//        }

        //获取全部成员变量
//        Field[] fields2 = clazz.getDeclaredFields();
//        //private java.lang.String Reflection.Demo3.Student.name
//        //private int Reflection.Demo3.Student.age
//        //public java.lang.String Reflection.Demo3.Student.gender
//        for (Field f : fields2) {
//            System.out.println(f);
//        }、
        //获取单个成员变量
        //public java.lang.String Reflection.Demo3.Student.gender
        Field gender = clazz.getDeclaredField("gender");
        System.out.println(gender);

        //通过对象获取该成员方法的值
        Student s = new Student("lisi",18,"男");
        String gender1 = (String) gender.get(s);
        System.out.println(gender1);//男
        
        //修改改成员变量的值
        gender.set(s,"女");
        System.out.println(s);//Student{name = lisi, age = 18, gender = 女}


    }
}
public class Student {
    private String name;
    private int age;

    private String aaa(String name) throws IOException,NullPointerException, EOFException {
        System.out.println("aaa"+name);
        return "请问请问";
    }
    public void bbb(String name,int age){
        System.out.println("bbb"+name+age);
    }

    public Student() {
    }

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

    /**
     * 获取
     * @return name
     */
    public String getName() {
        return name;
    }

    /**
     * 设置
     * @param name
     */
    public void setName(String name) {
        this.name = name;
    }

    /**
     * 获取
     * @return age
     */
    public int getAge() {
        return age;
    }

    /**
     * 设置
     * @param age
     */
    public void setAge(int age) {
        this.age = age;
    }

    public String toString() {
        return "Student{name = " + name + ", age = " + age + "}";
    }
}

public class Student {
    private String name;
    private int age;
    public String gender;


    public Student() {
    }

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

    /**
     * 获取
     * @return name
     */
    public String getName() {
        return name;
    }

    /**
     * 设置
     * @param name
     */
    public void setName(String name) {
        this.name = name;
    }

    /**
     * 获取
     * @return age
     */
    public int getAge() {
        return age;
    }

    /**
     * 设置
     * @param age
     */
    public void setAge(int age) {
        this.age = age;
    }

    /**
     * 获取
     * @return gender
     */
    public String getGender() {
        return gender;
    }

    /**
     * 设置
     * @param gender
     */
    public void setGender(String gender) {
        this.gender = gender;
    }

    public String toString() {
        return "Student{name = " + name + ", age = " + age + ", gender = " + gender + "}";
    }
}

利用反射获取成员方法

public class Demo4 {
    public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException, IllegalAccessException {
        //获取class对象
        Class<?> clazz = Class.forName("Reflection.Demo4.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);
//        }
        /**
         * public void Reflection.Demo4.Student.setAge(int)
         * public void Reflection.Demo4.Student.bbb(java.lang.String,int)
         * private void Reflection.Demo4.Student.aaa(java.lang.String)
         * public int Reflection.Demo4.Student.getAge()
         * public java.lang.String Reflection.Demo4.Student.getName()
         * public java.lang.String Reflection.Demo4.Student.toString()
         * public void Reflection.Demo4.Student.setName(java.lang.String)
         */

        //通过方法名和形参类型获取单个方法(有方法重载不能只靠方法名获取)
        Method m = clazz.getDeclaredMethod("aaa", String.class);
        //private void Reflection.Demo4.Student.aaa(java.lang.String)
        System.out.println(m);

        //获取各种数据
        //获取修饰符
        System.out.println(m.getModifiers());//2

        //获取方法的名字
        System.out.println(m.getName());//aaa

        //获取方法的形参
        Parameter[] parameters = m.getParameters();
        //java.lang.String arg0
        for (Parameter parameter : parameters) {
            System.out.println(parameter);
        }

        //获取方法的异常
        /**
         * class java.io.IOException
         * class java.lang.NullPointerException
         * class java.io.EOFException
         */
        Class<?>[] exceptionTypes = m.getExceptionTypes();
        for (Class<?> exceptionType : exceptionTypes) {
            System.out.println(exceptionType);
        }

        //方法运行
        /**
         * Method 类中用于创建对象的方法
         * Object invoke(Object obj,Object...args):运行方法
         * 参数一:用Obj对象调用该方法
         * 参数二:调用方法传递的参数(如果没有就不写)
         * 返回值:方法的返回值(如果没有就不写)
         */
        Student s = new Student();

        //暴露反射
        m.setAccessible(true);
        String str = (String) m.invoke(s, "汉堡包");//aaa汉堡包
        System.out.println(str);//请问请问

    }
}
public class Student {
    private String name;
    private int age;

    private String aaa(String name) throws IOException,NullPointerException, EOFException {
        System.out.println("aaa"+name);
        return "请问请问";
    }
    public void bbb(String name,int age){
        System.out.println("bbb"+name+age);
    }

    public Student() {
    }

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

    /**
     * 获取
     * @return name
     */
    public String getName() {
        return name;
    }

    /**
     * 设置
     * @param name
     */
    public void setName(String name) {
        this.name = name;
    }

    /**
     * 获取
     * @return age
     */
    public int getAge() {
        return age;
    }

    /**
     * 设置
     * @param age
     */
    public void setAge(int age) {
        this.age = age;
    }

    public String toString() {
        return "Student{name = " + name + ", age = " + age + "}";
    }
}

练习

练习一

public class Test {
    public static void main(String[] args) throws IOException, IllegalAccessException {
        Student s = new Student("小A",23,'女',167.5,"睡觉");
        Teacher t = new Teacher("波妞",10000);
        setdata(s);
//        setdata(t);
    }
    public static void setdata(Object obj) throws IOException, IllegalAccessException {
        //获取输出流
        FileOutputStream fos = new FileOutputStream("javaseday35\\src\\main\\java\\Reflection\\Test\\Test1\\a.txt");
        OutputStreamWriter osw = new OutputStreamWriter(fos);
        BufferedWriter bw = new BufferedWriter(osw);
        //获取输入对象的类对象
        Class<?> clazz = obj.getClass();
        //获取成员对象
        Field[] fields = clazz.getDeclaredFields();
        for (Field field : fields) {
//            //处理成员对象,将成员对象转化为String类型
//            String string = field.toString();
//            //将对象的名字使用split方法进行切割,使用转义字符按照 . 进行切割
//            String[] split = string.split("\\.");
//            //将最后赋值给key
//            String key = split[split.length - 1];
            String key = field.getName();
//            System.out.println(string1);
            //处理每个成员对象
            //授权访问私有对象
            field.setAccessible(true);
            //获取到对用的值
            Object o = field.get(obj);
            String value = o.toString();
            //将key和value 存入文件
            bw.write(key+"="+value);
            bw.newLine();
            bw.flush();
        }
        bw.close();
    }
}
public class Student {
    private String name;
    private int age;
    private char gender;
    private double height;
    private String hobby;
public class Teacher {
    private String name;
    private double salary;
name=波妞
salary=10000.0l

练习二

public class Test {
    public static void main(String[] args) throws IOException, IllegalAccessException, ClassNotFoundException, NoSuchMethodException, InvocationTargetException, InstantiationException {
        //获取配置文件的信息
        Properties pro = new Properties();
        FileInputStream fis = new FileInputStream("javaseday35\\src\\main\\java\\Reflection\\Test\\Test2\\pro.properties");
        //读取配置文件的信息
        pro.load(fis);
        fis.close();

        System.out.println(pro);
        //获取全类名和方法名
        String classmane = (String) pro.get("classmane");

        String mothed = (String) pro.get("mothed");

        System.out.println(classmane);
        System.out.println(mothed);

        //通过反射获取信息
        Class<?> clazz = Class.forName(classmane);
        //获取空参构造
        Constructor<?> constructor = clazz.getDeclaredConstructor();
        //通过空参构造获取空参对象
        Object o = constructor.newInstance();

        //通过方法名获取方法
        Method method = clazz.getDeclaredMethod(mothed);
        //调用方法
        method.invoke(o);
        
    }

}
pro.properties

classmane=Reflection.Test.Test2.Student
mothed=eat
public class Student {
    private String name;
    private int age;
    private char gender;
    private double height;
    private String hobby;

    public void eat(){
        System.out.println("正在吃饭");
    }
public class Teacher {
    private String name;
    private double salary;

    public void eat(){
        System.out.println("正在吃饭");
    }

总结

动态代理

public class BigStar implements Star{
    private String name;

    public String sing(String name){
        System.out.println(this.name+"正在唱"+name);
        return "谢谢";
    }

    public void drice(){
        System.out.println(name+"正在跳舞");
    }
    public BigStar() {
    }

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

    /**
     * 获取
     * @return name
     */
    public String getName() {
        return name;
    }

    /**
     * 设置
     * @param name
     */
    public void setName(String name) {
        this.name = name;
    }

    public String toString() {
        return "BigStar{name = " + name + "}";
    }
}
public interface Star {
    public abstract String sing(String name);

    public abstract void drice();
}

小结

创建代理

/*
*
* 类的作用:
*       创建一个代理
*
* */
public class ProxyUtil {


    /*
    *
    * 方法的作用:
    *       给一个明星的对象,创建一个代理
    *
    *  形参:
    *       被代理的明星对象
    *
    *  返回值:
    *       给明星创建的代理
    *
    *
    *
    * 需求:
    *   外面的人想要大明星唱一首歌
    *   1. 获取代理的对象
    *      代理对象 = ProxyUtil.createProxy(大明星的对象);
    *   2. 再调用代理的唱歌方法
    *      代理对象.唱歌的方法("只因你太美");
    * */
    public static Star createProxy(BigStar bigStar){
       /* java.lang.reflect.Proxy类:提供了为对象产生代理对象的方法:

        public static Object newProxyInstance(ClassLoader loader, Class<?>[] interfaces, InvocationHandler h)
        参数一:用于指定用哪个类加载器,去加载生成的代理类
        参数二:指定接口,这些接口用于指定生成的代理长什么,也就是有哪些方法
        参数三:用来指定生成的代理对象要干什么事情*/
        Star star = (Star) Proxy.newProxyInstance(
                ProxyUtil.class.getClassLoader(),//参数一:用于指定用哪个类加载器,去加载生成的代理类
                new Class[]{Star.class},//参数二:指定接口,这些接口用于指定生成的代理长什么,也就是有哪些方法
                //参数三:用来指定生成的代理对象要干什么事情
                new InvocationHandler() {
                    @Override
                    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                        /*
                        * 参数一:代理的对象
                        * 参数二:要运行的方法 sing
                        * 参数三:调用sing方法时,传递的实参
                        * */
                        if("sing".equals(method.getName())){
                            System.out.println("准备话筒,收钱");
                        }else if("dance".equals(method.getName())){
                            System.out.println("准备场地,收钱");
                        }
                        //去找大明星开始唱歌或者跳舞
                        //代码的表现形式:调用大明星里面唱歌或者跳舞的方法
                        return method.invoke(bigStar,args);
                    }
                }
        );
        return star;

    }
}
public class Test {
    public static void main(String[] args) {



    /*
        需求:
            外面的人想要大明星唱一首歌
             1. 获取代理的对象
                代理对象 = ProxyUtil.createProxy(大明星的对象);
             2. 再调用代理的唱歌方法
                代理对象.唱歌的方法("只因你太美");
     */


        //1. 获取代理的对象
        BigStar bigStar = new BigStar("鸡哥");
        Star proxy = ProxyUtil.createProxy(bigStar);

        //2. 调用唱歌的方法
        String result = proxy.sing("只因你太美");
        System.out.println(result);




    }
}
public class BigStar implements Star {
    private String name;


    public BigStar() {
    }

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

    //唱歌
    @Override
    public String sing(String name){
        System.out.println(this.name + "正在唱" + name);
        return "谢谢";
    }

    //跳舞
    @Override
    public void dance(){
        System.out.println(this.name + "正在跳舞");
    }

    /**
     * 获取
     * @return name
     */
    public String getName() {
        return name;
    }

    /**
     * 设置
     * @param name
     */
    public void setName(String name) {
        this.name = name;
    }

    public String toString() {
        return "BigStar{name = " + name + "}";
    }
}
public interface Star {

    //我们可以把所有想要被代理的方法定义在接口当中

    //唱歌
    public abstract String sing(String name);

    //跳舞
    public abstract void dance();


}

标签:String,age,day35,name,Student,println,javase,public,复习
From: https://blog.csdn.net/m0_72625929/article/details/142547008

相关文章

  • javaseday31多线程
    什么是多线程线程与进程小结并发和并行并发并行小结 多线程的实现方式方法一publicclassDemo1{publicstaticvoidmain(String[]args){//使用多线程的第一种方法/***1、创建一个类继承Thread类*2、并重写......
  • javase复习day33网络编程
    网络编程常见的软件架构BS架构CS架构网络编程小结网络编程三要素三要素小结IPIPV4IPV6IP小结IPV4的地址分类形式常用的CMD命令小结InetAddress的使用publicclassDemo1{publicstaticvoidmain(String[]args)throwsUnknownHostExcep......
  • 信息学奥赛复赛复习04-CSP-J2019-04-加工零件-位运算、整数映射0或1、结构体、初始化
    PDF文档回复:20240926<12019CSP-J题目4加工零件[题目描述]凯凯的工厂正在有条不紊地生产一种神奇的零件,神奇的零件的生产过程自然也很神奇。工厂里有n位工人,工人们从1∼n编号。某些工人之间存在双向的零件传送带。保证每两名工人之间最多只存在一条传送带如果......
  • 信息学奥赛复赛复习04-CSP-J2019-04-加工零件-位运算、整数映射0或1、结构体、初始化
    PDF文档公众号回复关键字:2024092612019CSP-J题目4加工零件[题目描述]凯凯的工厂正在有条不紊地生产一种神奇的零件,神奇的零件的生产过程自然也很神奇。工厂里有n位工人,工人们从1∼n编号。某些工人之间存在双向的零件传送带。保证每两名工人之间最多只存在一条传送带......
  • 计算机复习9.23
    关系:一张扁平的二维表,关系应该具备每个分量都不可分的数据(1NF)候选码:某个属性组可以唯一标识一个元组,而其子集不能,候选码中的属性叫主属性主码:从候选码中选取一个称为主码全码:所有属性组合在一起作为这个关系的候选码传统集合:并,交,差,笛卡尔积,差专门关系云算:选择,投影,连接,......
  • 计算机组成原理408第五章中央处理器知识点快速回顾二轮复习
    CPU由运算器和控制器这样的两大部件来组成,那么运算器由ACC累加寄存器,乘商寄存器,还有若干个通用寄存器以及算术逻辑单元alu来组成。那除了这些寄存器,还有alu之外,还会有一些其他的重要的寄存器,我们在之前没有介绍过。运算器主要负责对数据进行处理,也就是算术运算和逻辑运......
  • 信息学奥赛复赛复习02-CSP-J2019-02-结构体、无构造函数、有构造函数、初始化列表构造
    PDF文档公众号回复关键字:2024092412019CSP-J题目2公交换乘[题目描述]著名旅游城市B市为了鼓励大家采用公共交通方式出行,推出了一种地铁换乘公交车的优惠方案在搭乘一次地铁后可以获得一张优惠票,有效期为45分钟,在有效期内可以消耗这张优惠票,免费搭乘一次票价不超过......
  • JavaSE——数据类型与变量
    文章目录一、字面常量字面常量的分类:二、数据类型三、变量1、变量概念2.语法格式3.整形变量3.1整形变量3.2长整型变量3.3短整型变量3.4字节型变量4.浮点型变量4.1双精度浮点型变量4.2单精度浮点型5.字符型变量6.布尔型变量一、字面常量publicclass......
  • 信息学奥赛复赛复习01-CSP-J2019-01-字符、字符数组、字符串、string、字符串读取
    信息学奥赛复赛复习01-CSP-J2019-01-字符、字符数组、字符串、string、字符串读取PDF文档公众号回复关键字:2024092312019CSP-J题目1数字游戏[题目描述]小K同学向小P同学发送了一个长度为8的01字符串来玩数字游戏,小P同学想要知道字符串中究竟有多少个1。注......
  • JavaSE---Fail-Fast
    总结主要用于集合类中,以确保在遍历集合时如果集合本身被修改,则会立即抛出ConcurrentModificationException异常。原理内部计数器:每个集合对象都有一个内部计数器,称为modCount(modificationcount)。每当集合结构被修改(比如添加或删除元素),这个计数器就会增加。迭代器检查:当......