黑马程序员——Java反射

 黑马程序员——Java反射

---------------------- android培训java培训、期待与您交流! ----------------------

一、Java语言的反射机制

在Java运行时环境中,对于任意一个类,能否知道这个类有哪些属性和方法?对于任意一个对象,能否调用它的任意一个方法?答案是肯定的。这种动态获取类的信息以及动态调用对象的方法的功能来自于Java 语言的反射(Reflection)机制。

Java 反射机制主要提供了以下功能:

在运行时判断任意一个对象所属的类;

在运行时构造任意一个类的对象;

在运行时判断任意一个类所具有的成员变量和方法;

在运行时调用任意一个对象的方法。

二、Class 对象的取得途径

Java允许我们从多种途径为一个class生成对应的Classobject


三、构造方法(Constructor)的反射

Class.getConstructors():获得类的public类型的构造方法。

Class.getConstructor(Class[]parameterTypes):获得类的特定构造方法,parameterTypes 参数指定构造方法的参数类型。

  实例:

Constructor<?> con = String.class.getDeclaredConstructor(byte[].class);
System.out.println(con);
 
String s=(String)con.newInstance("fengyan".getBytes());
System.out.println(s);

四、成员变量(Field)的反射

Field类代表类的成员变量(成员变量也称为类的属性)。

Class.getField(String name):根据指定成员名获得类的public类型的属性。

Class.getDeclaredField(String name):根据指定成员名获得类的属性(包括private属性)。

Field.setAccessible(boolean flag):用指定的标记设置属性的访问权限。

Field.get(Object obj):返回这个字段在指定对象上的值。

● 实例:

public class ReflectPoint {
    private int x;
    public int y;
    public ReflectPoint(int x, int y) {
        this.x = x;
        this.y = y;
    }
}
 
import java.lang.reflect.Field;
 
public class ReflectField {
    public static void main(String[] args) throws Exception {
        ReflectPoint pt = new ReflectPoint(3, 5);
        Field fieldX = pt.getClass().getDeclaredField("x");
        Field fieldY = pt.getClass().getField("y");
        fieldX.setAccessible(true);
        System.out.println("x = " + fieldX.get(pt));//访问私有成员
        System.out.println("y = " + fieldY.get(pt));
    }
}

五、成员方法(Method)的反射

Method类代表类的一个成员方法。

得到类的某一人方法:

         MethodcharAt=String.class.getMethod(“charAt”, int.class);

调用方法:

         通常方式:System.out.println(“fengyan”.charAt(1));

         反射方式:System.out.println(charAt.invoke(“fengyan”,1));

如果Method为静态方法,则调用invoke(Object obj, Object… args)方法的第一个参数传null。

● 实例:通过反射调用main(String[] args)方法

package com.heima.reflect;
public class InvokeMain {
    public static void main(String[] args) {
        if (args != null && args.length > 0) {
            for (String arg : args)
                System.out.println(arg);
        } else {
            System.out.println("args is null");
        }
    }
}
 
import java.lang.reflect.Method;
public class ReflectInvokeMain {
    public static void main(String[] args) throws Exception {
        String className = "com.heima.reflect.InvokeMain";
        Class<?> clazz = Class.forName(className);
        Method main = clazz.getMethod("main", String[].class);     
        main.invoke(null, new Object[] { new String[] { "111", "222", "333" } });
    }
}

---------------------- android培训java培训、期待与您交流! ----------------------

详细请查看:http://edu.csdn.net/heima





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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值