java反射用法简述

java反射机制,根据百科上的解释为:JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制。也就是说你可以通过反射来直接调用一个类的静态的方法或属性。

 

下面来说一下反射的基本步骤

1、获取要反射的类的Class实例

2、获取构造器

3、获取所有方法

4、获取所有属性

5、获取指定方法并调用

6、获取指定属性并赋值

 

 

 

 

1、获取要反射的类的Class实例(下面的步骤都会用到这个clazz对象),这次我反射的是java.lang.String类

  public Class<?> clazz;

    @Before
    public void before() throws ClassNotFoundException {
//        两种方式获取Class实例 这个地方要填写完整的包名
//        clazz = Class.forName("java.lang.String");
        clazz = String.class;
    }



 

2、获取构造器

    private void constructor() throws NoSuchMethodException {
        System.out.println("获取构造器----------华丽的分割线---------------------------------");
        Constructor<?>[] constructor = clazz.getConstructors();
        for (Constructor<?> aConstructor : constructor) {
//            获取方法的访问修饰符 private public protected
            String s = Modifier.toString(aConstructor.getModifiers());
            System.out.print(s + " " + " " + aConstructor.getName() + "(");
//            获取参数列表
            Parameter[] parameters = aConstructor.getParameters();
            for (int j = 0; j < parameters.length; j++) {
                System.out.print(parameters[j].getType().getSimpleName() + " " + parameters[j].getName());
                if (j != parameters.length - 1) {
                    System.out.print(",");
                }
            }
            System.out.println(")");
        }
    }
 

3、获取所有方法

private void method(){
        System.out.println("获取方法----------华丽的分割线---------------------------------");
//        获取所有方法,入如果只想获取公有方法可以用getMethods
        Method[] methods = clazz.getDeclaredMethods();
        for (Method method : methods) {
//            获取访问修饰符
            String modifier = Modifier.toString(method.getModifiers());
//            获取返回类型
            String simpleName = method.getReturnType().getSimpleName();
//            获取方法名
            String name = method.getName();
            System.out.print(modifier + " " + simpleName + " " + name + "(");
//            获取参数列表
            Parameter[] parameters = method.getParameters();
            for (int j = 0; j < parameters.length; j++) {
                System.out.print(parameters[j].getType().getSimpleName() + " " + parameters[j].getName());
                if (j != parameters.length - 1) {
                    System.out.print(",");
                }
            }
            System.out.println(")");
        }
    }

 

4、获取所有属性

 private void field() throws IllegalAccessException {
        System.out.println("获取属性----------华丽的分割线---------------------------------");
//        获取所有属性 对于公有属性可以用getFields来获取
        Field[] declaredFields = clazz.getDeclaredFields();
        for (Field e :
                declaredFields) {
//            给属性赋值,第一个参数为指定的对象,后面一个参数为要赋予的值
//            e.set("","");
            System.out.println(Modifier.toString(e.getModifiers())+" "+e.getType().getSimpleName()+" "+e.getName());
        }
    }

 

5、获取指定方法并调用

private void methodWithParm() throws NoSuchMethodException, InvocationTargetException, IllegalAccessException {
        System.out.println("获取指定方法----------华丽的分割线---------------------------------");
//        获取指定方法,要指定方法名和参数类型
        Method charAt = clazz.getMethod("charAt", int.class);
//        对于私有方法的调用,必须要设置这一项,否则会报错
//        charAt.setAccessible(true);
        String s = "abcd";
//        执行该方法,第一个参数为要执行的对象,后面的多个参数都为要执行的方法所需要参数
        char c = (char) charAt.invoke(s,1);
        System.out.println(c);
    }



6、获取指定属性并赋值

    private void appointedField() throws NoSuchFieldException, IllegalAccessException {
        Field declaredField = clazz.getDeclaredField("hash");
//        对于私有属性必须要设置这一项
        declaredField.setAccessible(true);
        String x = "abcd";
        System.out.println(x.hashCode());
//        给该属性赋值,第一个参数为要执行的对象,第二个参数为赋予的值
        declaredField.set(x,123456);
        System.out.println(x.hashCode());
    }

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值