zoukankan      html  css  js  c++  java
  • 反射的应用、获取Class类实例

    *准备工作:
    包结构:*
    这里写图片描述

    =======================
    Person.java代码:

    package com.atguigu.java;
    
    public class Person {
        String name;
        private int age;
    
    
        public Person() {
            super();
        }
        public Person(String name, int age) {
            super();
            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;
        }
        @Override
        public String toString() {
            return "Person [name=" + name + ", age=" + age + "]";
        }
        public void show(){
            System.out.println("我是一个show方法");
        }
    }
    
    

    =======================
    反射的引用:

    package com.atguigu.java;
    
    import java.lang.reflect.Field;
    import java.lang.reflect.Method;
    
    import org.junit.Test;
    
    /*
     * 反射的应用
     * 
     */
    public class ReflectionTest {
        /*
         * 在反射之前,如何实例化Person类,并调用其内部结构
         */
        @Test
        public void test1(){
            //1.创建Person类的对象
            Person p1 = new Person();
            System.out.println(p1);
            //2.调用指定的属性
            p1.name = "Tom";
    
            //3.调用指定的方法
            p1.setAge(12);
            p1.show();
    
            System.out.println(p1);
        }
    
        /*
         * 反射的应用,完成与test1同样的操作
         * 
         */
        @Test
        public void test2() throws Exception{
            Class clazz = Person.class;// PrintStream ps = System.out;
    
            //1.创建Person类的对象
            Person p = (Person)clazz.newInstance();
            System.out.println(p);
    
            //2.调用指定的属性
            //Field field1 = clazz.getField("name");会报错
            Field field1 = clazz.getDeclaredField("name");
            //设置指定的p对象的field1属性的值
            //f.set(Object obj,Object fieldValue):将obj对象的f属性设置为fieldValue
            field1.set(p, "Tom");
    
            System.out.println(p);
            //f.get(Object obj):获取指定的obj对象的f属性值
            System.out.println(field1.get(p));
    
            //3.调用指定的方法
            Method m1 = clazz.getDeclaredMethod("setAge",int.class);
            //m.invoke(Object obj,Object ... paramValues):调用obj对象指定的m方法,将参数值设置为Object ... paramValues
            m1.invoke(p, 20);
            System.out.println(p);
        }
    }
    

    ===================================
    获取Class类的实例的几种方式:

    /*
         * java.lang.Class类的理解
         * 1.java反射机制的源头
         * 2.java程序经过编译(javac.exe)以后,生成一个或多个字节码文件(.class)文件,接着通过
         * java.exe命令将.class文件通过JVM的类的加载器加载到内存(缓存)中,一个字节码文件,就对应着一个
         * 运行时类。
         * 3.此时内存中的运行时类即为Class的一个实例。也就是说:一个Class实例就对应一个java运行时类
         * 4.内存中的运行时类,是存放在内存的缓存区,当再次被调用时,不会重新加载。
         * 
         * 如何获取java.lang.Class类的实例(掌握)
         * 
         */
        @Test
        public void test1() throws ClassNotFoundException{
            Person p = new Person();//1.将Person类加载到内存中 2.调用其空参的构造器
            Person p1 = new Person();//不会重新加载Person类,因为其已经存在于内存中
    
            //方式一:直接调用运行时类的.class属性获取
            Class clazz1 = Person.class;
            System.out.println(clazz1);
    
            //方式二:调用Class类的静态方法:forName(String className)  --后续使用的较多
            String className = "com.atguigu.java.Person";
            Class clazz2 = Class.forName(className);
    
            System.out.println(clazz2);
    
            //方法三:调用运行时类对象的getClass()
            Class clazz3 = p.getClass();
            System.out.println(clazz3);
    
            System.out.println(clazz1 == clazz2 && clazz1 == clazz3);//true
    
            //方式四:使用类的加载器ClassLoader (了解)
            Class clazz4 = this.getClass().getClassLoader().loadClass("com.atguigu.java.Person");
            System.out.println(clazz4);
            System.out.println(clazz4 == clazz1);
    
        }
  • 相关阅读:
    ASP.NET中26种性能优化方法
    ASP.NET中常用的26个优化性能方法
    ASP.NET页面事件:顺序与回传详解
    ASP.NET控件属性大全
    ADO.NET数据库编程
    ado.net笔记
    98内存管理
    23个常用正则表达式(数值和字符串)
    web中用纯CSS实现筛选菜单
    Unity3D脚本:C#计时类脚本
  • 原文地址:https://www.cnblogs.com/lisingshen/p/7499735.html
Copyright © 2011-2022 走看看