• Java反射初识


    反射Class类

    Class类是反射的根源,很多很多的类,经过抽象,得出了一个Class类,包括类名,构造方法,属性方法等。得到Class类的对象的三种方式:

    1. Object类中的getClass()方法
    2. 通过类名.class
    3. 通过Class.forName()方法

    代码示例:

    import org.junit.Test;
    import java.lang.reflect.Constructor;
    import java.lang.reflect.Field;
    import java.lang.reflect.Modifier;
    
    public class ReflectionDemo {
    
    	//JUnit测试的方法一定要是public
    
    	/**
    	 * 获取Class对象的三种方式
    	 */
    	@Test
    	public void function() {
    	    //第一种方式:通过对象的getClass方法获得
    	    Dog dog = new Dog("Tom", "男", 5);
    	    Class dogClass1 = dog.getClass();
    
    	    //第二种方式:通过类.class
    	    Class dogClass2 = Dog.class;
    
    	    //第三种方式:通过Class.forName()方法
    	    try {
    	        Class dogClass3 = Class.forName("reflection.Dog");
    	    } catch (ClassNotFoundException e) {
    	        e.printStackTrace();
    	    }
    	}
    
    	/**
     	 * 通过反射来实例化对象
         */
    	@Test
    	public void function2() {
        	try {
        	    Class<Dog> dogClass = (Class<Dog>) Class.forName("reflection.Dog");
    
        	    //获取默认的构造器,并创建一个Dog对象
        	    Dog dog1 = ((Dog) dogClass.newInstance());//调用了默认的无参构造
        	    System.out.println("dog1:" + dog1);
    
        	    //获取一个指定的构造器,并通过构造器创建一个Dog对象
        	    Constructor<Dog> constructor = dogClass.getConstructor(String.class, String.class, int.class);
        	    Dog dog2 = constructor.newInstance("Tom", "female", 4);
        	    System.out.println("dog2:" + dog2);
    
        	    //获取所有的构造方法
        	    Constructor<?>[] constructors = dogClass.getConstructors();
        	    for (int i = 0; i < constructors.length; i++) {
        	        //获取构造方法的参数个数
        	        System.out.println("构造方法参数个数为:" + constructors[i].getParameterCount());
        	    }
    
        	    //获取所有属性(包括私有属性)
        	    Field[] fields = dogClass.getDeclaredFields();
        	    for (int i = 0, len = fields.length; i < len; i++) {
        	        //获得属性的修饰符
        	        int modifiers = fields[i].getModifiers();
        	        System.out.println(Modifier.toString(modifiers) + " " + fields[i].getType() + " " + fields[i].getName());
        	    }
        	} catch (Exception e) {
        	    e.printStackTrace();
        	}
    	}
    }
    

    总结

    通过反射获取到的Class对象,我们可以用于创建对象,获得构造器,获取参数类型等。

  • 相关阅读:
    git 更新代码
    jmeter 线程组之间传递动态变化的变量值
    MYSQL 使用存储过程批量更新表数据
    linux查看日志中特定字符串以及前后信息内容命令
    导出表结构 字段说明
    转 awk统计nginx每天访问最高的接口
    MySQL 同一字段匹配多个值
    Can't connect to local MySQL server through socket '/opt/lampp/var/mysql/mysql.sock' (2)
    转 Xshell ssh长时间连接不掉线设置
    Vs.net 常用命令行
  • 原文地址:https://www.cnblogs.com/zxfei/p/10923212.html
Copyright © 2020-2023  润新知