黑马程序员—java技术blog—第八篇:反射

11 篇文章 0 订阅
11 篇文章 0 订阅

---------------------- <a href="http://edu.csdn.net/heima" target="blank">android培训</a>、<a href="http://edu.csdn.net/heima" target="blank">java培训</a>、期待与您交流! ----------------------

一、理解什么是反射

反射:

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

动态获取类中信息,就是java反射。可以理解为对类的解剖。反射大大提高功能扩展性。

 

Tomcat

提供了处理请求和应答的方式。因为具体的处理操作不同,所以对外部提供了接口,有开发者来实现具体的请求和应答处理。

 

二、获取字节码文件对象

 

要想对字节码文件进行解剖,必须有字节码文件对象,如何获取字节码文件对象呢?

方式一:

1.object类中的getClass()方法的。

//想要用这种方式 必须明确具体类,并创建对象。

Person p=new Person();

Class clazz=p.getclass();

方式二:

2.任何数据类型都具备一个静态的属性,用class来获取其对应的Class对象。

Class clazz=Person.class;

 

方式三:

只要通过给定的类的字符串名称就可以获取该类,更为扩展。该方法是forName

String className="cn.itcast.bean.Person";//类名前要加上包

Class clazz=Class.forName(className);

 

三、获取字段

获取字节码文件中的字段:Filed

String name="cn.itcase.bean.Person";

Class clazz=class.forNamr(name);

Filed filed=clazz.getFiled("age");

//Filed都只能拿到public,可以拿到父类的

Filed filed=clazz.getDeclaredFiled("age");

//只获取本类的,包含私有。

//对私有字段的访问取消检查。暴力访问。

filed.setAccessible(true);

Object obj=clazz.newInstance();

filed.set(obj,89);

四、获取构造函数

String name="cn.itcase.bean.Person";

//找寻该名称类文件,并加载内存,并产生Clas对象

Class clazz=class.forNamr(name);

//产生该类的对象

Object obj=clazz.newInstance();

//一般被反射的类都带空参

当获取指定名称对应类中的所体现的对象时:而该对象初始化不使用空差构造函数时该怎么办?既然是按照指定的构造函数进行初始化,所以要先获取该构造函数。通过字节码文件对象即可完成。该方法是:getConstructor(paramterTypes).

//获取到差数为Stringint的构造函数

Constructor<T>con=clazz.getConstructor(String.class,int.class);

//通过该构造器对象的newInstance方法进行对象的初始化。

Object obj=con.newInstance("xiao",38);

 

五、获取函数

String name="cn.itcase.bean.Person";

Class clazz=class.forNamr(name);

Method[]methods=clazz.getMethod();//获得都是公共的

Method[]methods=clazz.getDeclaredMethod();//获取本类的所有方法

Method method=clazz.getMethod("show",null);//show函数名,获取空参的show();

Method method=clazz.getMethod("show",String.class,int,class);

//获取参数为Stringint名为show的函数。

//运行函数

method.invoke();

 

六、数组反射的应用

已知一个数组,用反射把它每个元素打印出来?

 

import java.lang.reflect.Array;

public class Deom6 {

public static void main(String[] args)

 throws ReflectiveOperationException, RuntimeException {

// TODO 自动生成的方法存根

int []arr={2,34,55,56};

      printObject(arr);

}

private static void printObject(Object objectthrows ReflectiveOperationException, RuntimeException {

// TODO 自动生成的方法存根

Class clazz=object.getClass();

if(clazz.isArray()){

int len=Array.getLength(object);

for (int i = 0; i < leni++) {

System.out.println(Array.get(objecti));

}

}else{

System.out.println(object);

}

}

} System.out.println(object);

}

}

----- <a href="http://edu.csdn.net/heima" target="blank">android培训</a>、<a href="http://edu.csdn.net/heima" target="blank">java培训</a>、期待与您交流! ----------------------
详细请查看:<a href="http://edu.csdn.net/heima" target="blank">http://edu.csdn.net/heima</a>

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值