Java反射机制

 

Java 反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法;这种动态获取的信息以及动态调用对象的方法的功能称为 Java 语言的反射机制。

Java 反射机制主要提供了以下功能:
      1. 在运行时判断任意一个对象所属的类
      2.
在运行时构造任意一个类的对象
      3.
在运行时判断任意一个类所具有的成员变量和方法(通过反射甚至可以调用private 方法)
      4.
在运行时调用任意一个对象的方法(***** 注意:前提都是在运行时,而不是在编译时)

Java 反射相关的API 简介:
     
位于java.lang.reflect 包中
        --Class
类:代表一个类
        --Filed
类:代表类的成员变量
        --Method
类:代表类的方法
        --Constructor
类:代表类的构造方法
        --Array
类:提供了动态创建数组,以及访问数组的元素的静态方法, 该类中的所有方法都是静态方法

例子:

package TestReflection;

 

import java.lang.reflect.Field;

import java.lang.reflect.Constructor;

import java.lang.reflect.InvocationTargetException;

import java.lang.reflect.Method;

 

class TestClass

{

    public int number ;

    private String str ;

   

    public TestClass()

    {

       number = 0;

       str = "" ;

    }

    public TestClass(String str, int number)

    {

       this . number = number;

       this . str = str;

    }

    public void setNumber( int number)

    {

       this . number = number;

    }

    public void setString(String str)

    {

       this . str = str;

    }

    public int getNumber()

    {

       return number ;

    }

    public String getString()

    {

       return str ;

    }

    public String toString()

    {

       return str + " " + number ;

    }

}

 

public class TestReflection

{

    public static void main(String[] args)

    {

       try

       {

           Class c = Class.forName ( "TestReflection.TestClass" );

          

           /// objNO 对象使用默认构造函数

           Object objNo = (TestClass)c.newInstance();

           System. out .println(objNo);

          

          

           // 设置参数类型

           Class[] params = new Class[2];

           params[0] = String. class ;

           params[1] = Integer. TYPE ;

           // 获得带参构造函数

           Constructor constructor = c.getConstructor(params);

           // 设置参数

           Object[] objects = new Object[2];

           objects[0] = "Hello" ;

           objects[1] = new Integer(100);

           /// objHave 对象使用带参构造函数

           Object objHave = constructor.newInstance(objects);

           System. out .println(objHave);

          

          

           // 设置参数类型

           Class[] paramStr = {String. class };

           // 获得参数

           Method setMethod = c.getMethod( "setString" , paramStr);

           // 设置参数

           Object obj = "SetMethod" ;

           /// objNo 对象使用方法

           setMethod.invoke(objNo, obj);

           System. out .println(objNo);

          

          

           /// 修改私有成员值

           Field testStr = c.getDeclaredField( "str" );

           testStr.setAccessible( true );

           testStr.set(objHave, "world" );

          

          

           /// 修改公有成员值

           Field testNumber = c.getField( "number" );

           testNumber.setInt(objHave, 200);

           System. out .println(objHave);

        }

       catch (ClassNotFoundException e)

       {

           System. out .println( "Exceptoin: No Class" );

       }

       catch (SecurityException e)

       {

           e.printStackTrace();

       }

       catch (NoSuchMethodException e)

       {

           System. out .println( "Exceptoin: No Method" );

       }

       catch (NoSuchFieldException e)

       {

           System. out .println( "Exceptoin: No Field" );

       }

       catch (IllegalArgumentException e)

       {

           e.printStackTrace();

       }

       catch (InstantiationException e)

       {

           e.printStackTrace();

       }

       catch (IllegalAccessException e)

       {

           e.printStackTrace();

       }

       catch (InvocationTargetException e)

       {

           e.printStackTrace();

       }

    }

}

  推荐网站:好巴鹿(http:// www.haobalu.com

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值