Java反射详解及编程示例

反射的用处:

  • 在运行时 分析类的能力
  • 在运行时查看对象
  • 实现通用的数组操作代码
  • 利用Method对象,这个对象很像C++中的函数指针

Class类

在Java程序运行期间,Java的运行时系统始终为所有对象维护一个运行时的类型标识,这个信息用来跟踪每个对象所属的类,这些信息被保存在名为Class的类中,以便访问这些信息;

Java中为每个类创建一个Class类的实例对象,用来保存这个类的相关信息;

Class类的相关方法:

java.lang.Class


Class forName(String Classname);
    //返回String对应的类的CLass对象
Fiedl[] getFields();
    //返回一个包含Field对象的数组,这些对象记录了这个类或者其超类的 公有 域;没有域的时候将返回一个长度为0的数组;
Field[] getDeclaredFields();
    //返回这个类的 所有 域,但不包含超类的域;
Method[] getMethods();
    //返回该类及其超类的公有方法;
Method[] getDeclaredMethods();
    //返回该类的所有方法,但不包括该类的超类的方法;
Constructor[] getConstructors();
Constructor[] getDeclaredConstructors();

虚拟机为每个类管理一个Class对象,因此可以调用“==”来比较两个Class对象:

if(a.getClass()==aclassName.class)

利用反射分析类的能力

反射中最重要的机制——检查类的结构

java.lang.reflect中有三个类Field、Method、Constructor分别用于描述类的域;

java.lang.reflect.Field

java.lang.reflect.Method

java.lang.reflect.Constructor

Class getDeclaringClass();
    //返回Class对象的实例
Class[] getExceptionTypes();
    //返回一个用于描述方法抛出的异常的类型的Class对象数组;
int getModifiers();
    //返回一个用于描述修饰符的整数,Modifier类中的相关方法可以分析这个整数
String getName();
    //返回描述方法域名或者构造器的字符串;
Class[] getParameterTypes()
    //返回一个描述参数类型的Class对象数组
ClassgetReturnType()
    //返回一个描述返回类型的Class对象

利用反射打印类的信息:

package algorithm;
import java.io.*;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
import java.util.*;

public class ReflectionTest {
    public int testa;
    public int testb;
    private int c;

        public static void main(String args[])
        {
          System.out.println("This is main Class");
          Scanner in=new Scanner (System.in);

          //String className=in.next();

              try{
                  rTest r=new rTest(2);
                  r.getClass();
                  //获得类名对应的类的Class实例
                  Class c=Class.forName("algorithm.rTest");
                  //获得该类名


                  System.out.println("类的名字: "+c.getName());

                  //获得类或者超类的公有域
                  Field[] fields=c.getDeclaredFields();
                  System.out.println("类的所有域: ");
                  for(Field fi:fields){
                      int mod=fi.getModifiers();
                      String modifier=Modifier.isPrivate(mod)?"private":(Modifier.isPublic(mod)?"public":"protected");
                      System.out.println(modifier+"  "+fi);
                  }

                  //获得类或者超类的公有方法
                  Method[]methods=c.getDeclaredMethods();
                  System.out.println("类的公有方法: ");
                  for(Method fun:methods){
                      System.out.println(fun);
                  }
                  //返回类或者超类的公有构造器
                  Constructor[]constructors=c.getConstructors();
                  System.out.println("类的公有构造器: ");
                  for(Constructor con:constructors){
                      System.out.println(con);
                  }


              }catch (ClassNotFoundException cne){
                  System.out.println("没有找到该类!!!");
              }

        }

        String name;
        public ReflectionTest(){
            ;
        }
        ReflectionTest(String  b){
            this.name=b;
            System.out.println("this is father class");
        }
        static void test(Integer x){

            System.out.println(x);
        }
}
//测试类
class rTest extends ReflectionTest{
    //Data field
    public int a;
    public String b;

    protected int c;
    protected String d;
    private int e;
    private String f;
    //default
    int g;
    String h;

    //methods
    public int A(int a){
        return a;
    }

    public void pf(){};
    private int B(int b){
        return b;
    }

    protected int C(int c){
        return c;
    }

    int D(int d){
        return d;
    }

    //constructer
   public rTest(){
        System.out.println("无参构造器");
    }
    public rTest(int a){
        this.a=a;
        System.out.println("有参公有构造器");
    }
    private rTest(int a,String b){
        this.a=a;
        this.b=b;
        System.out.println("有参私有构造器");
    }
}

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值