黑马程序员___java反射的总结

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

一、       反射的基础_Class类

1、Class类: java程序中各个java类属于同一种事物,描述这类事物的java类名就是Class。

Class其实就是java类被编译后生成的字节码的引用数据类型。

例如:Class cls1= System.class; Class cls2 = Date.class;

2、得到各个字节码对应的实例对象的三中方法

①类名.class 例如Class cls1 = System.class;

②对象.getClass()例如 new Date().getClass();

③Class.forName(“类名”) 例如 class.forName(“java.util.Date”) 此是反射常用的获得类字节码的方法,,可以在使用的时候才传入在编译不确定的类名。

3、类型Class实例对象(字节码)的特点简单介绍

public class ReflectTest{

public static void main (String[] args){

String str1 =”abc”;

Class cls1= str1.getClass();

Class cls2= String.class;

Class cls3= Class.forName(“java.lang.String”);

System.out.print(cls1= = cls2);//true

System.out.print(cls2= = cls3;//true

//三者是共一份String字节码。

System.out.print(cls1.isPrimitive());//判断是否为八大基本类型(int boolean long short float double byte char)和void之一

System.out.print(int.class= =Integer.class);//false

System.out.print(int.class= =Integer.TYPE);//true  Integer.TYPETYPE就是指Integer包装的字节码,即Integer包装了int的字节码

System.out.print(int[].class.isPrimitive());//true

System.out.print(int[].class.isArray());//true

 

}

}

总之,只要是在源程序出现的类型,都有各自的Class实例对象,例如,int[ ],void…都有自己的字节码。

二、       理解反射的概念

反射就是把java类中的各种成分映射成相应的java类。

例如,一个java类中用一个Class类的对象来表示,一个类中的组成部分:成员变量,方法,构造方法,包等信息也用一个个的java类来表示,就像汽车是一个类,汽车的发动机,变速箱等也是一个个类。表示java类的Class类显然要提供一系列的方法来获得其中的变量,方法,构造方法,修饰符,包等信息,这些信息就是用相应类的实例对象来表示,它们是Field、Method、Contruct、Package等等。

三、       分类讲述常用的反射

⒈构造方法的反射应用

Constructor类代表某个类中的一个构造方法。得到某个类的所有构造方法:例子

Constructor [] constructor = Class.forName(“java.lang.String”).getConstructors();

得到某一个构造方法,例子:

Constructor constructor = Class.forName(“java.lang.String”).getConstructor(StringBuffer.class);

//获得某个构造方法需要指定参数类型

Constructor constructor1 =String.class.getConstructor(StringBuffer.class,int.class);//得到构造方法用参数区分是哪个构造函数

创建实例对象:

通常方式:Stringstr = new String(new StringBuffer(“abc”));

反射方式:1、Constructor constructor =Class.forName(“java.lang.String”).getConstructor (StringBuffer.class);

2、String str = (String)constructor.newInstance (new StringBuffer(“abc”));

Class中也有一个newInstance()方法:Class. newInstance()

例子:String obj= (String) Class.forName(“java.lang.String”). newInstance();该方法内部先得到默认的构造方法(无参数的哪个构造方法),然后用该构造方法创建实例对象。

⒉成员变量的反射

Field类代表某个类中的一个成员变量。

得到的Field对象时对应到类上面的成员变量,所以在取某个成员变量值的时候要注意方法。

例子:publicclass ReflectPoint {

    privateintx;

    publicinty;

    public ReflectPoint(int x, int y) {

       super();

       this.x = x;

       this.y = y;

    }

   

}

import java.lang.reflect.Field;

publicclass FiledTest {

    publicstaticvoid main(String[] args) throws Exception{

       ReflectPoint pt1 = new ReflectPoint(3,5);

       Field fieldy= pt1.getClass().getField("y"); //fieldy不是对象的变量,是类上的,要用它去取某个对象身上对应的值

       System.out.println( fieldy.get(pt1));//只能取公有成员

       //取私有成员方法如下:

       Field fieldx= pt1.getClass().getDeclaredField("x");

       fieldx.setAccessible(true);

       System.out.println(fieldx.get(pt1));

   

}

}

⒊成员方法的反射(Method类)

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

得到类中的某一个方法:

 

 

public Method getMethod(String name, Class<?>... parameterTypes)

                throws NoSuchMethodException, SecurityException

返回一个 Method 对象,它反映此 Class 对象所表示的类或接口的指定公共成员方法。name 参数是一个 String,用于指定所需方法的简称。parameterTypes 参数是按声明顺序标识该方法形参类型的 Class 对象的一个数组。如果 parameterTypes 为 null,则按空数组处理。

例子MethodcharAt = Class.forName(“java.lang.String”).getMethod(“charAt”,int.class);

String str = “abc”;

调用方法charAt打印出b字符

通常方法:System.out.println(str.charAt(1)));

反射方法:MethodmethodcharAt = String.class. getMethod(“charAt”,int.class);

System.out.println(methodcharAt.invoke(str,1));

 public Objectinvoke(Object obj, Object... args) throws llegalAccessException,IllegalArgumentException, InvocationTargetException

对带有指定参数的指定对象调用由此Method 对象表示的底层方法。个别参数被自动解包,以便与基本形参相匹配,基本参数和引用参数都随需服从方法调用转换。 如果底层方法是静态的,那么可以忽略指定的 obj 参数。该参数可以为 null。如果方法正常完成,则将该方法返回的值返回给调用者;如果该值为基本类型,则首先适当地将其包装在对象中。但是,如果该值的类型为一组基本类型,则数组元素不被包装在对象中;换句话说,将返回基本类型的数组。如果底层方法返回类型为 void,则该调用返回 null。

---------------------- android培训java培训、期待与您交流! ----------------------详细请查看: http://edu.csdn.net/heima
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值