zoukankan      html  css  js  c++  java
  • 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对象,我们可以用于创建对象,获得构造器,获取参数类型等。

  • 相关阅读:
    安卓逆向5.Android Studio JNI静态注册(C++和Java互操作)
    安卓逆向二
    ASP.Net Core Web 在IIS下的发布流程
    Android Studio安装记录
    Vistual studio智能提示不显示或者显示为英文的解决办法
    (转)程序语言理论的学习对于程序员教育的作用
    普通用户ssh无密码登录设置
    (转)完全用GNU/Linux工作 by 王珢
    (转)谁是真正的程序语言专家
    java操作XML
  • 原文地址:https://www.cnblogs.com/zxfei/p/10923212.html
Copyright © 2011-2022 走看看