java反射机制

1、偶想

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

2、JAVA反射机制简介

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

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

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

3、进入代码

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

package com.majun.ref;

public class Test extends SuperTest implements Interface1, Interface2
{
  public String name;


  public Test(){

  }
 

  public Test(String s1, String s2){
  }


  public void print(String msg){
  }

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

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
{
  public static void main(String[] args) throws Exception
  {
    Class<?> classType = Class.forName("com.majun.ref.Test");
  
    //获取属性(getFields只能获取public类型的属性,getDeclaredFields可以获取所有属性)

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

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

 

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

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

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

5、冰山一角

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值