博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java学习笔记——反射
阅读量:4967 次
发布时间:2019-06-12

本文共 3921 字,大约阅读时间需要 13 分钟。

反射就是把Java类中的各种成分映射成相应的java类。

Class类-->java程序中的各个java类属于同一事物,描述这类事物的Java类名就是Class。

Class.forName的作用:返回类的字节码,返回的方式有两种,一种是这个类曾被加载过,则直接从JVM中返回字节码,另一种是JVM中没用这个类的字节码,得用类加载器先将字节码加载到JVM中,然后返回字节码。

得到类的字节码的三种方式

1.类名.class
2.对象.getClass();
3.Class.forName("完整类名");例如: Class.forName("java.lang.String");(多用于反射)

public class ReflectTest {    public static void main(String[] args) throws Exception{                String str = "abc";        Class cls1 = str.getClass();        Class cls2 = String.class;        Class cls3 = Class.forName("java.lang.String");                System.out.println(cls1==cls2);//true        System.out.println(cls1==cls3);//true                //判断是否是基本类型        System.out.println(cls1.isPrimitive());//false        System.out.println(int.class.isPrimitive());//true        System.out.println(int[].class.isPrimitive());//false                System.out.println(int.class==Integer.class);//false        System.out.println(int.class==Integer.TYPE);//true            }}
View Code
//用反射实现    new String(new StringBuffer("abc")    Constructor constructor =     String.class.getConstructor(StringBuffer.class);    String str1 = (String) constructor.newInstance(new StringBuffer("abc"));    System.out.println(str1);//abc
View Code

 

成员变量的反射(Field类)

//定义一个Point类public class Point {        private int x;    public int y;        public Point(int x, int y) {        super();        this.x = x;        this.y = y;    }}用反射映射Point类Point p = new Point(3,4);Field filedY = p.getClass().getField("y");//getField只能得到可见的属性System.out.println(filedY.get(p));//得到对象p在属性y上的具体值   Field filedX = p.getClass().getDeclaredField("x");//getDeclaredField可以得到私有属性filedX.setAccessible(true);//暴力反射,将私有的设置为可访问的System.out.println(filedX.get(p));成员变量反射练习public class Cat {        String name = "Happy";    String eyes = "Black";    String eat = "beef";    @Override    public String toString() {        return "Cat [name=" + name + ", eyes=" + eyes + ", eat=" + eat + "]";    }    }public class ReflectTest2 {    public static void main(String[] args) throws Exception {                Cat cat = new Cat();        System.out.println(cat);//Cat [name=Happy, eyes=Black, eat=beef]        ChangeCat(cat);        System.out.println(cat);//Cat [name=Hbppy, eyes=Blbck, eat=beef]    }    private static void ChangeCat(Cat obj) throws Exception {                Field[] fields = obj.getClass().getDeclaredFields();                for(Field field:fields){            field.setAccessible(true);            if(field.getType()==String.class){                String oldStr = (String) field.get(obj);                String newStr = oldStr.replace('a', 'b');                field.set(obj, newStr);            }        }            }}
View Code

成员方法反射(Method类)

public class ReflectTest2 {    public static void main(String[] args) throws Exception {                String str1 = "abc";        Method method =  Class.forName("java.lang.String").            getMethod("charAt", int.class);        char ch = (char) method.invoke(str1, 1);        System.out.println(method.invoke(str1, 1));//b        System.out.println(method.invoke(str1, new Object[]{2}));//c    }}
View Code

对含有数组参数的成员方法进行反射

//定义一个含有main方法的类class TestArguments{    public static void main(String[] args){                for(String arg : args){            System.out.println(arg);        }    }}public class ReflectTest {    public static void main(String[] args) throws Exception {                        /*用反射来实现调用main方法*/        String className = args[0];        Method mainMethod = Class.forName(className).getMethod("main", String[].class);        mainMethod.invoke(null, (Object)new String[]{"111","222","333"});        mainMethod.invoke(null, new Object[]{
new String[]{"111","222","333"}}); //以上两种调用等价,jdk1.5后,会将数组参数进行拆解,这样上述的一个数组参数就变成了3个参数,则会出现数组个数不匹配, //故应将数组强制转换成Object或将数组作为一个对象用Object数组进行封装 }}
View Code

 

转载于:https://www.cnblogs.com/lahblogs/p/4338090.html

你可能感兴趣的文章
2.4 传输控制协议(TCP)
查看>>
golang-build-error
查看>>
Docker使用docker-compose.yml构建Asp.Net Core和Mysql镜像并与Mysql数据库通信
查看>>
pause 和 title
查看>>
向值栈放List集合
查看>>
Spring AOP开发
查看>>
CentOS Docker环境搭建教程
查看>>
EqualsBuilder 类的使用
查看>>
『原创』+『参考』亲手实验:使用C#在PPC中播放声音
查看>>
100层高楼摔2个鸡蛋的问题
查看>>
Linux常用配置
查看>>
Linux压缩那些事儿
查看>>
实验1
查看>>
ActionBar在Android2.x的实现,类似新版微信界面。
查看>>
python_day1
查看>>
访问者模式(Visitor)
查看>>
linux 重新编译低版本gcc
查看>>
git log 查看某文件的修改历史
查看>>
列的拼接
查看>>
CSS3小模块hover左右交替互换动画
查看>>