java反射简介

想要了解反射,最基本的类就是Class类,因为Class能够保存类的信息。在类中含有构造方法、函数、属性。这些都能够通过某种手段得到。

1.获得字节码的方法:

(1)Class.forName(String)

(2)p.getClass();

(3)P.class;

Class c1 =...;

c1.getDeclaredConstructors();返回一个Constructor数组。    包含一个类中的构造函数。

2.通过构造方法进行反射:newInstance

getConstructor(Class)进行对某个类的构造函数进行声明。

newInstance(Object);能够创建一个实例。

以下为实例:

Constructor c = String.class.getConstructor(StringBuffer.class);
            String str = (String) c.newInstance(new StringBuffer("123"));
            System.out.println(str);
这样就能够创建一个String的实例。

3.对于域的反射:get

能够反映出当前对象的域的值是多少.

私有变量的反射需要f.setAccessible(true);


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

public class ReflectField {

    public static void main(String[] args) {
        ReflectPoint o = new ReflectPoint(1, 2);
        Field fy = null;
        try {
            fy = o.getClass().getDeclaredField("y");
            fy.setAccessible(true);
            Integer x = (Integer) fy.get(o);

            System.out.println(x);
            
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

class ReflectPoint {
    private int x;

    private int y;

    public ReflectPoint(int x, int y) {
        super();
        this.x = x;
        this.y = y;
    }

}

示例:有一个类,其中包含很多字符串的属性,想要把每个字符串属性中的‘b’变成‘a’,并显示结果

import java.lang.reflect.AccessibleObject;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;

public class ReflectField {

    public static void main(String[] args) {
        ReflectPoint o = new ReflectPoint(1, 2);
        Field[] fs ;
        try {
            fs = o.getClass().getDeclaredFields();
            AccessibleObject.setAccessible(fs, true);
            for(Field f:fs)
            {
                if(f.getType() ==String.class)
                {
                    String str = (String)f.get(o);
                    String result = str.replace("b", "a");
                    f.set(o, result);
                    System.out.println(result);
                }
            }
            
            
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

class ReflectPoint {
    private int x;

    private int y;
    
    
    private String str1 = "basketball";
    private String str2 = "ball";
    private String str3 = "it";
    public ReflectPoint(int x, int y) {
        super();
        this.x = x;
        this.y = y;
    }

}
4.方法反射:

(1)getMethod()声明

(2)invoke()方法调用

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

public class ReflectField {

    public static void main(String[] args) {
        ReflectPoint o = new ReflectPoint();
        try {

            Method m = o.getClass().getDeclaredMethod("getStr1", null);
            String name = (String) m.invoke(o, null);
            System.out.println(name);
            
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

class ReflectPoint {
 
    private String str1 = "busketBall";
    public ReflectPoint() {
        super();
    }
    public String getStr1()
    {
        return str1;
    }
}




Constructor:

(1)getModifiers();返回访问权限。能够由Modifier.toString(i)转换成字符串。

(2)getName();返回构造函数的函数名。

(3)getParameterTypes()返回参数的Class,需要对每个参数Class调用getName()获得参数类型。

c1.getDeclaredFields();返回一个Field数组。            包含一个类中的属性。

Field:

(1)getType()返回属性类型

(2)f.get(Object obj);Obj是一个类,包含f属性,返回当前f属性的当前值。

(3)int i=getModifiers()返回访问权限。能够由Modifier.toString(i)转换成字符串。

(4)getName()返回属性名称。

(5)f.set(Object obj,Object val);把Object类中的f属性设置为val值。

c1.getDeclaredMethods()返回一个Method数组。     包含一个类中的一般方法。

Method:

(1)getModifiers()返回访问权限。能够由Modifier.toString(i)转换成字符串。

(2)getName();返回函数的函数名。

(3)getParameterTypes()返回参数的Class,需要对每个参数Class调用getName()获得参数类型。

(4)getReturnType()返回值的类型


下面是一个示例代码,输入一个类,然后把输入类的构造方法,域,函数都打印出来:

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
import java.util.Scanner;


public class ReflectTest {
    public static void main(String args[])
    {
        Scanner in = new Scanner(System.in);
        String str = in.nextLine();
        Class c = null;
        try {
            c = Class.forName(str);
        } catch (ClassNotFoundException e) {
            System.out.println("********出错!********");
            e.printStackTrace();
        }
        String tmp = Modifier.toString(c.getModifiers());
        System.out.println(tmp+" class "+c.getName()+"{");
        printField(c);
        printConstructor(c);
        printMethod(c);
        System.out.println("}");
        
    }
    public static void printField(Class c)
    {
        Field[] f = c.getDeclaredFields();
        for(int i=0;i<f.length;i++)
        {
            int p = f[i].getModifiers();
            String tmp = Modifier.toString(p);
            String type = f[i].getType().getName();
            String name = f[i].getName();
            System.out.println("  "+tmp+" "+type+" "+name+";");
        }
    }
    public static void printConstructor(Class c)
    {
        Constructor[] con = c.getDeclaredConstructors();
        for(int i=0;i<con.length;i++)
        {
            int p = con[i].getModifiers();
            String tmp = Modifier.toString(p);
            String name = con[i].getName();
            Class[] param = con[i].getParameterTypes();
            System.out.print("  "+tmp+" "+name+"(");
            for(int j=0;j<param.length;j++)
            {
                System.out.print(param[j].getName());
            }
            System.out.println(");");

        }
    }
    public static void printMethod(Class c)
    {
        Method[] m = c.getDeclaredMethods();
        for(int i=0;i<m.length;i++)
        {
            int p = m[i].getModifiers();
            String tmp = Modifier.toString(p);
            String type = m[i].getReturnType().getName();
            String name = m[i].getName();
            Class[] param = m[i].getParameterTypes();
            System.out.print("  "+tmp+" "+type+" "+name+"(");
            for(int j=0;j<param.length;j++)
            {
                System.out.print(param[j].getName());
            }
            System.out.println(");");

        }
    }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值