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对象,我们可以用于创建对象,获得构造器,获取参数类型等。

posted on 2019-05-25 17:38  行之间  阅读(132)  评论(0编辑  收藏  举报