Java学习笔记----反射

在许多框架中大家都会听到反射这个技术,但是它到底是什么呢,在框架中到底起什么作用呢?

  • 反射的概念
  • 反射的用法
  • 反射与框架

反射的概念

   Java反射是指在程序运行时获取已知名称的类或已有对象的相关信息的一种机制,包括类的方法、属性、父类等信息,还包括示例的创建和示例类型的判断等。 举例说明:
   对于下面的A类,能否根据类名A,1)列出这个类有哪些属性和方法;2)对于任意一个对象,调用它的任意一个方法。
public class A{
    void func() { }
    public static void main (String args[]){
            A obj = new A();
            obj.func();
    }
}

在JDK中,主要由以下类来实现Java反射机制,这些类都在java.lang.reflect包中。
Class类:代表一个类
Constructor类:代表类的构造方法
Field类:代表类的成员变量(类的属性)
Method类:代表累的方法

反射的用法

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
public class A {
    int m;
    String s;
    public A(){
        System.out.println("This is A");
    }
    public A(Integer m){
        System.out.println("This is" + m);
    }
    public A(String s,Integer m){
        System.out.println(s+":"+m);
    }
    public void func1(){
        System.out.println("This is func1");
    }
    public void func2(Integer m){
        System.out.println("This is func2"  + m);
    }
    public void func3(String s,Integer m){
        System.out.println("This is func3"  + s+m);
    }
    public static void main(String[] args) throws Exception {
        //加载并初始化指定的类A
        Class classInfo = Class.forName("A");

        //获得类的构造方法
        System.out.println("类的构造函数如下所示:");
        Constructor cons[] = classInfo.getConstructors();
        for(int i = 0; i < cons.length; i++){
            System.out.println(cons[i].toString());
        }

        //获取类的所有变量
        System.out.println();
        System.out.println("类的变量如下所示:");
        Field fields[] = classInfo.getFields();
        for(int i = 0; i < fields.length; i++){
            System.out.println(fields[i].toString());
        }

        //获得类的方法
        System.out.println();
        System.out.println("类的方法如下所示:");
        Method methods[] = classInfo.getMethods();
        for(int i = 0; i < methods.length; i++){
            System.out.println(methods[i].toString());
        }       

        //调用构造方法(第一种方法)
        //调用无参构造
        System.out.println();
        System.out.println("调用构造方法(第一种方法):");
        cons[2].newInstance();
        //调用1个参数的构造
        cons[1].newInstance(new Object[] {10});
        //调用2个参数的构造
        cons[0].newInstance(new Object[] {"Hello",2015});

        //调用构造方法(第二种方法)
        //调用无参构造
        System.out.println();
        System.out.println("调用构造方法(第二种方法):");
        Constructor c =classInfo.getConstructor();
        c.newInstance();
        //调用1个参数的构造
        c = classInfo.getConstructor(new Class[] {Integer.class});
        c.newInstance(new Object[]{10});
        //调用2个参数的构造
        c = classInfo.getConstructor(new Class[] {String.class,Integer.class});
        c.newInstance(new Object[] {"Hello",2015});

        //调用成员方法
        System.out.println();
        System.out.println("调用成员方法:");
        //调用无参构造函数,生成实例对象
        Object obj = classInfo.getConstructor().newInstance();
        //调用无参成员函数func1()
        Method mt1 = classInfo.getMethod("func1");
        mt1.invoke(obj);
        //调用1个参数的成员函数func2
        Method mt2 = classInfo.getMethod("func2",Integer.class);
        mt2.invoke(obj,new Object[] {10});
        //调用两个参数成员函数func3
        Method mt3 = classInfo.getMethod("func3",String.class,Integer.class);
        mt3.invoke(obj,new Object[] {"Hello",2015});        
    }
}

输出结果:
类的构造函数如下所示:
public A(java.lang.String,java.lang.Integer)
public A(java.lang.Integer)
public A()

类的构造函数如下所示:
public A(java.lang.String,java.lang.Integer)
public A(java.lang.Integer)
public A()

类的变量如下所示:

类的方法如下所示:
public static void A.main(java.lang.String[]) throws java.lang.Exception
public void A.func3(java.lang.String,java.lang.Integer)
public void A.func2(java.lang.Integer)
public void A.func1()
public final void java.lang.Object.wait(long,int) throws java.lang.InterruptedException
public final native void java.lang.Object.wait(long) throws java.lang.InterruptedException
public final void java.lang.Object.wait() throws java.lang.InterruptedException
public boolean java.lang.Object.equals(java.lang.Object)
public java.lang.String java.lang.Object.toString()
public native int java.lang.Object.hashCode()
public final native java.lang.Class java.lang.Object.getClass()
public final native void java.lang.Object.notify()
public final native void java.lang.Object.notifyAll()

调用构造方法(第一种方法):
This is A
This is10
Hello:2015

调用构造方法(第二种方法):
This is A
This is10
Hello:2015

调用成员方法:
This is A
This is func1
This is func210
This is func3Hello2015

反射与框架

反射技术的编程特点:大大提高了编制稳定框架的能力。具体表现在,当新增加功能的时候,仅增加相应的功能类,而框架调用可能不需要发生变化。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值