关于Java反射你了解多少

今天任然是第二次看张老师的高新技术基础

今天,我看了反射,觉得这个很好,可以在很多地方用到

如替换一篇文章中的敏感词汇,制作框架等等都会有用到反射,

反射很强大

下面是一个实例,各位友友可以Copy运行从中学习反射的相关知识

如有不懂,留言,我会有相关答复!!

package im.fldy;

import java.lang.reflect.Array;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.Arrays;

public class Reflection {

    public static void main(String[] args) throws ClassNotFoundException,
            SecurityException, NoSuchMethodException, IllegalArgumentException,
            InstantiationException, IllegalAccessException,
            InvocationTargetException, NoSuchFieldException {
        // Class 代表内存中的一份字节码
        /**
         * 得到字节码 类名.classs 如:System.class; 对象.getClass
         * Class.forName("类名");如:Class.forName("java.util.Date");
         * 其实每一个类在内存中就是以字节码的形式存在! 以下是得到字节码的三种方法!
         */
        String str = "abc";
        Class cls1 = str.getClass();
        Class cls2 = String.class;
        Class cls3 = Class.forName("java.lang.String");

        System.out.println(cls1 == cls2);
        System.out.println(cls3 == cls2);

        System.out.println(cls1.isPrimitive());// 字节码是否为基本类型的判断
        System.out.println(int.class.isPrimitive());

        System.out.println(int.class == Integer.class);
        System.out.println(int.class == Integer.TYPE);

        System.out.println(int[].class.isArray());// 判断是否为数组

        // 得到构造方法 ; 然后再把具体的对象穿给它,我们就可以得到具体对象的构造方法!!
        Constructor constructor = String.class
                .getConstructor(StringBuffer.class);
        String str2 = (String) constructor.newInstance(new StringBuffer("abc"));
        System.out.println(str2.charAt(2));// 用反射的到字符串的查找方法,并输出查找结果

        // 本来你要我去买可乐给你喝,因为每天都要,多以我直接进一批可乐每天卖给你,清爽!
        // 无参构造方法的实现
        ReflectionPoint pt1 = new ReflectionPoint(3, 5);
        Field fieldy = pt1.getClass().getField("y");// 得到可见的变量
        System.out.println(fieldy.get(pt1));
        // 得到私有变量
        Field fieldx = pt1.getClass().getDeclaredField("x");// 得到可见的变量
        fieldx.setAccessible(true);// 允许访问私有属性!也叫暴力反射
        System.out.println(fieldx.get(pt1));

        // 改变字符串,例如我面的是实例,就是对于一些不良言语我们可以使其用*号显示,这个在很多网页上我们都遇见过
        // 相信大家不会陌生
        changeStringValue(pt1);
        System.out.println(pt1);

        Method methodCharAt = String.class.getMethod("charAt", int.class);
        System.out.println("取出第二个字符" + methodCharAt.invoke(str, 1));

        // 一般调用main方法
        Test.main(new String[] { "asd", "qwe", "sdf" });
        // 用反射调用main方法
        String startingClassName = "im.fldy.Test";
        Method mainMethod = Class.forName(startingClassName).getMethod("main",
                String[].class);
        mainMethod.invoke(null, (Object) new String[] { "asd", "qwe", "sdf" });

        int[] a1 = new int[] { 1, 2, 34, 5, 5 };
        int[] a2 = new int[4];
        int[][] a3 = new int[2][1];
        String[] a4 = new String[] { "q", "ssda", "asd" };
        System.out.println(a1.getClass() == a2.getClass());
        System.out.println(a1.getClass().getName());// [I 整型数组名
        System.out.println(a3.getClass().getName());// [[I 字符数组名
        System.out.println(a1.getClass().getSuperclass().getName());
        System.out.println(a3.getClass().getSuperclass().getName());

        // 下面是检查是否可以直接打印集合中的元素结果发现Int[]数组中的元素不能直接遍历
        System.out.println(a1);
        System.out.println(a4);
        System.out.println(Arrays.asList(a1));
        System.out.println(Arrays.asList(a4));

        // 打印数组中的所有元素
        printObject(a1);
        printObject(a4);
    }

    // 对于Int数组不能直接打印其中的元素,我们可以采用下面的办法
    // 用反射的原理先判断传入的对象是不是数组,这样我们就可以同时遍历Int[]和String[]了
    private static void printObject(Object obj) {
        // TODO Auto-generated method stub
        Class claz = obj.getClass();
        if (claz.isArray()) {
            int len = Array.getLength(obj);
            for (int i = 0; i < len; i++) {
                System.out.println(Array.get(obj, i));
            }
        } else {
            System.out.println(obj);
        }
    }

    /**
     * 本方法利用反射的原理对传进去的ReflectionPoint类中的String字符串变量进行替换 如一些非法字符,不良言语等等替换
     */

    private static void changeStringValue(Object obj)
            throws IllegalArgumentException, IllegalAccessException {
        Field[] fields = obj.getClass().getFields();
        for (Field field : fields) {
            if (field.getType() == String.class) {
                String oldValue = (String) field.get(obj);
                String newValue = oldValue.replace('操', '*');
                field.set(obj, newValue);
            }
        }
    }

    public static class ReflectionPoint {
        private int x;
        public int y;
        public String s = "小日本我操你";
        public String sb = "广播体操";
        public String sbc = "操作系统";

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

        @Override
        public String toString() {
            return "1:" + s + "2:" + sb + "3:" + sbc + "";

        }
    }

}

class Test {
    public static void main(String[] args) {
        for (String arg : args) {
            System.out.println(arg);
        }
    }
}

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值