zoukankan      html  css  js  c++  java
  • 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();
            }
        }
    }



  • 相关阅读:
    文件下载和进度显示
    响应
    log4j2-2.13.0版本安装
    maven私服nexus仓库3.24.0版本搭建
    window下MYSQL定时备份表库的BAT
    JBoss7.3.0EAP版本安装
    jetbrains-IDEA2020版本插件搜索以及官方汉化和其他插件安装介绍
    Jenkins迁移job插件Job Import Plugin
    Appium下出现Original error: pkg.... 解决办法
    IIS10下部署.NetCore站点出现出现 HTTP 错误 500.19,错误代码:0x8007000d及一些问题
  • 原文地址:https://www.cnblogs.com/charlexu/p/2850666.html
Copyright © 2011-2022 走看看