java反射机制

1、偶想

<wbr><wbr>胡乱做了两年的Java开发,对于Java反射机制总感觉很深奥,加之工作上用之不多,一直回避对这块的学习!这两天刚刚参与完了一个项目,工作比较清闲,早上梳头时突然想到“reflection”这个词,哈哈,来到公司后感觉应该学学Java反射机制了!发现其实不难,而且挺好玩的!为自己用学会了一点东西而高兴,也马上想到要把自己的学习笔记记下来!</wbr></wbr>

2、JAVA反射机制简介

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

<wbr><wbr>Java 反射机制主要提供了以下功能:<br><wbr>* 在运行时判断任意一个对象所属的类。<br><wbr>* 在运行时构造任意一个类的对象。<br><wbr>* 在运行时判断任意一个类所具有的成员变量和方法。<br><wbr>* 在运行时调用任意一个对象的方法。</wbr></wbr></wbr></wbr></wbr></wbr>

<wbr><wbr>反射是Java被视为动态(或准动态)语言的一个关键性质。</wbr></wbr>

3、进入代码

<wbr><wbr>我一贯认为,概念大致了解就行,关键是会用!毕竟我们是开发工程师(说的好听点,不能自己埋汰自己)!来,看下面的代码吧(记得写代码一定要加上注释啊,这才是关键):</wbr></wbr>

package com.majun.ref;

public class Test extends SuperTest implements Interface1, Interface2
{
<wbr>public String name;</wbr>


<wbr>public Test(){</wbr>

<wbr>}<br><wbr></wbr></wbr>

<wbr><wbr>public Test(String s1, String s2){<br><wbr>}</wbr></wbr></wbr>


<wbr><wbr>public void print(String msg){<br><wbr>}<br><br><wbr>public int add(int a, int b)<br><wbr>{<br><wbr><wbr><wbr><wbr>return a + b;<br><wbr><wbr>}<br> }<br> Test只是个为了演示而写的一个准备类,有接口实现,有超类继承,有属性,有方法!这里代码没有完全给出,也不需要详细介绍了!,下面这个类才是真正演示反射的:</wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>

package com.majun.ref;

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.lang.reflect.Type;

public class ReflectTest
{
<wbr>public static void main(String[] args) throws Exception<br><wbr>{<br><wbr><wbr><wbr>Class&lt;?&gt; classType = Class.forName("com.majun.ref.Test");<br><wbr><wbr><br><wbr><wbr><wbr>//获取属性(getFields只能获取public类型的属性,getDeclaredFields可以获取所有属性)</wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>

<wbr><wbr><wbr>//(下同,注意Declared修饰词)</wbr></wbr></wbr>

<wbr><wbr><wbr>Field[] fs = classType.getFields();<wbr>//.getDeclaredFields();<wbr><br><wbr><wbr><wbr>for(Field f : fs)<br><wbr><wbr><wbr>{<br><wbr><wbr><wbr><wbr><wbr>System.out.println(f.getName());<br><wbr><wbr><wbr>}<br><wbr><wbr><br><wbr><wbr><wbr>//获取指定的属性<br><wbr><wbr><wbr>Field f = classType.getDeclaredField("name");//.getField("name");<br><wbr><wbr><wbr>System.out.println(f.toString());<br><wbr><wbr><br><wbr><wbr><wbr>//获取构造函数<br><wbr><wbr><wbr>Constructor&lt;?&gt;[] cs = classType.getDeclaredConstructors();//.getConstructors();<br><wbr><wbr><wbr>for(Constructor&lt;?&gt; c : cs)<br><wbr><wbr><wbr>{<br><wbr><wbr><wbr><wbr><wbr>System.out.println(c.toString());<br><wbr><wbr><wbr>}<br><wbr><wbr><br><wbr><wbr><wbr>//获取指定参数类型的构造函数<br><wbr><wbr><wbr>Constructor&lt;?&gt; c = classType.getConstructor(java.lang.String.class,<wbr><wbr>java.lang.String.class);//.getDeclaredConstructor(java.lang.String.class);<br><wbr><wbr><wbr>System.out.println(c.toString());</wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>

<wbr></wbr>

<wbr><wbr><wbr>//获取直接实现的接口<br><wbr><wbr><wbr>Type[] ts = classType.getGenericInterfaces();<br><wbr><wbr><wbr>for(Type t : ts)<br><wbr><wbr><wbr>{<br><wbr><wbr><wbr><wbr><wbr><wbr>System.out.println(t.toString());<br><wbr><wbr><wbr>}<br><wbr><wbr><br><wbr><wbr><wbr>//获取直接继承的超类<br><wbr><wbr><wbr>Type t = classType.getGenericSuperclass();<br><wbr><wbr><wbr>System.out.println(t.toString());<br><wbr><wbr><br><wbr><wbr><wbr>//获取方法<br><wbr><wbr><wbr>Method[] ms = classType.getDeclaredMethods();//.getMethods();</wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>

<wbr><wbr><wbr>for(Method m : ms)<br><wbr><wbr><wbr>{<br><wbr><wbr><wbr><wbr><wbr><wbr>System.out.println(m.toString());<br><wbr><wbr><wbr>}<br><wbr><wbr><br><wbr><wbr><wbr>//获取指定的方法<br><wbr><wbr><wbr>Method m = classType.getMethod("print", new Class[]{String.class});<br><wbr><wbr><wbr>System.out.println(m.toString());<br><wbr><wbr><br><wbr><wbr><wbr>//方法调用<br><wbr><wbr><wbr>Object invoker = classType.newInstance();<br><wbr><wbr><wbr>Method md = classType.getMethod("add", new Class[]{int.class, int.class});<br><wbr><wbr><wbr>Object obj = md.invoke(invoker, new Object[]{new Integer(19), new Integer(65)});<br><wbr><wbr><wbr>System.out.println((Integer)obj);<br><wbr>}<br> }<br> 4、哈哈</wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>

通过上面的学习,我们应该对Java放射机制有了一个大致的了解了,对于其他一些常用的应用,比如运行时复制对象、运行时改变属性内容、动态创建数组等,这里不再演示!

5、冰山一角

当然,Java反射不会这么简单,后面的内容还海着呢,这里只能算是冰山一角,更大的奥妙等着你去学习!乐在其中!无痴迷,不成功!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值