Java反射的简单应用

Java反射能够得到Class中Private的构造函数,方法和成员。

对于以下三类组件中的任何一类来说 -- 构造函数、字段和方法 -- java.lang.Class 提供四种独立的反射调用,以不同的方式来获得信息。调用都遵循一种标准格式。

以下是用于查找构造函数的一组反射调用:
Constructor getConstructor(Class[] params) -- 获得使用特殊的参数类型的公共构造函数,
Constructor[] getConstructors() -- 获得类的所有公共构造函数
Constructor getDeclaredConstructor(Class[] params) -- 获得使用特定参数类型的构造函数(与接入级别无关)
Constructor[] getDeclaredConstructors() -- 获得类的所有构造函数(与接入级别无关)

获得字段信息的Class 反射调用不同于那些用于接入构造函数的调用,在参数类型数组中使用了字段名:
Field getField(String name) -- 获得命名的公共字段
Field[] getFields() -- 获得类的所有公共字段
Field getDeclaredField(String name) -- 获得类声明的命名的字段
Field[] getDeclaredFields() -- 获得类声明的所有字段

用于获得方法信息函数:
Method getMethod(String name, Class[] params) -- 使用特定的参数类型,获得命名的公共方法
Method[] getMethods() -- 获得类的所有公共方法
Method getDeclaredMethod(String name, Class[] params) -- 使用特写的参数类型,获得类声明的命名的方法
Method[] getDeclaredMethods() -- 获得类声明的所有方法

测试代码如下:


public class SourceClass {
    public String field1 = "field1";
    private String field2 = "field2";
    
    public SourceClass(){
        System.out.println( "Constructor1 !" );
    }
    
    private SourceClass( String str ){
        System.out.println( "Constructor2 !" );
    }
    
    public String method1(){
        return( "Method1 !" );
    }
    
    private String method2(){
        return( "Method2 !" );
    }
}

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

public class ReflectClass {
    public static void main(String[] arg){
        SourceClass sourceClass = new SourceClass();
        System.out.println( sourceClass.field1 );
        System.out.println( sourceClass.method1() );
        
        try {
            //Private Field
            Field reflectField2 = sourceClass.getClass().getDeclaredField( "field2" );
            reflectField2.setAccessible( true );
            System.out.println( reflectField2.get( sourceClass ) );
            reflectField2.setAccessible( false );
            
            //Private Method
            Method reflectMethod2 = sourceClass.getClass().getDeclaredMethod( "method2" );
            reflectMethod2.setAccessible( true );
            System.out.println( reflectMethod2.invoke( sourceClass ).toString() );
            reflectMethod2.setAccessible( false );
            
            //Private Constructor
            Constructor reflectConstructor = sourceClass.getClass().getDeclaredConstructor( String.class );
            reflectConstructor.setAccessible( true );
            reflectConstructor.newInstance( new String("None") );
            reflectConstructor.setAccessible( false );
        }
        catch ( SecurityException e ) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        catch ( NoSuchFieldException e ) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        catch ( IllegalArgumentException e ) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        catch ( IllegalAccessException e ) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        catch ( NoSuchMethodException e ) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        catch ( InstantiationException e ) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        catch ( InvocationTargetException e ) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}



原文地址:https://www.cnblogs.com/charlexu/p/2850666.html