首页 > 其他分享 >反射机制

反射机制

时间:2022-09-03 16:01:32浏览次数:53  
标签:反射 java String System println 机制 Class out

通过反射机制可以操作字节码文件(黑客哈哈哈)

package com.javastudy.example12;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.Date;
import java.util.Properties;
import java.util.ResourceBundle;

public class ReflectTest01 {
    public static void main(String[] args) {
        Class c1 = null,c2=null;
        try {
             c1=Class.forName("java.lang.String"); //String类型
            c2=Class.forName("java.util.Date");
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }

        String x="123";
        Class s1=x.getClass();//String类型
        System.out.println(s1 == c1);//true
        Date d=new Date();
        Class s2=d.getClass();
        System.out.println(s2==c2);//true
       //java中任意类型都有.class.属性
        Class z=String.class;
        System.out.println(z==s1);//true


        System.out.println("==============================");
        try {
            Class test=Class.forName("com.javastudy.example11.Test");
            System.out.println("newInstance之前");
            Object obj= test.newInstance();//实例化对象,调用无参构造
            System.out.println("newInstance之后");
            System.out.println(obj);//输出对象

            FileReader read=new FileReader("D:\\JavaStudy\\src\\com\\javastudy\\example12\\dd.properties");
            Properties pro=new Properties();
            pro.load(read);
          read.close();
          String className=pro.getProperty("className");
            System.out.println(className);
            System.out.println("==============资源绑定机制,方便================");
            ResourceBundle bundle=ResourceBundle.getBundle("com\\javastudy\\example12\\dd");//文件在src下,并且不加后缀!!!
            String className2=bundle.getString("className");
            System.out.println(className2);

            System.out.println("==============通过反射机制================");
            Class cla=Class.forName(className);

            Object obj2=cla.newInstance();
            System.out.println(obj2);//配置文件可修改

        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (InstantiationException e) {
            e.printStackTrace();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }

    }
}

运行截图
image

例二

package com.javastudy.example12;

import java.lang.reflect.Field;
import java.lang.reflect.Modifier;

public class ReflectTest02 {
    public static void main(String[] args) {
        Class c1=null;
        try {
            c1=Class.forName("com.javastudy.example12.Test");
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
        Field[] f=c1.getFields();
        System.out.println(f.length);          //输出公有属性个数
        Field[] f2=c1.getDeclaredFields();
        System.out.println(f2.length);        //输出属性个数
        System.out.println("=====================");
        for (Field fi:f2
             ) {
            //获取修饰符
            int count=fi.getModifiers();        //返回的数字的修饰符的代号
            String s= Modifier.toString(count);  //转换为字符串
            System.out.println(s);
            Class ftype=fi.getType();           //获取属性类型
            System.out.println(ftype.getName());
            System.out.println(fi.getName());  //获取属性的名字

            //获取并修改属性的值
            System.out.println("===================");
            try {
                Object obj=c1.newInstance();

                Field fx=c1.getDeclaredField("name");

                fx.set(obj,"2022");               //修改属性的值
                System.out.println(fx.get(obj));  //读取属性的值

                Field fx2=c1.getDeclaredField("no");
                fx2.setAccessible(true);//打破封装
                fx2.set(obj,2022);
                System.out.println("打破封装"+fx2.get(obj));
            } catch (InstantiationException e) {
                e.printStackTrace();
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            } catch (NoSuchFieldException e) {
                e.printStackTrace();
            }

        }

    }
}

运行结果
image

标签:反射,java,String,System,println,机制,Class,out
From: https://www.cnblogs.com/hzxiang/p/16652828.html

相关文章

  • 说说 JS 的事件循环机制 ?
    执行js代码时,遇到同步任务,直接推入调用栈执行,遇到异步任务,将该任务挂起,等到有返回结果后放到任务队列中;当调用栈中的任务全部执行完成后,这时开始事件循环(Eventloo......
  • 3.3 垃圾回收机制
    一引入解释器在执行到定义变量的语法时,会申请内存空间来存放变量的值,而内存的容量是有限的,这就涉及到变量值所占用内存空间的回收问题,当一个变量值没有用了(简称垃圾)就应......
  • java 用反射获取自定义注解的信息实例
    最近看了些spring的源码,回来重新看一下反射和注解的一些文档,写了一个小例子,记录一下。packagecom.wbk.annotation;importjava.lang.annotation.*;importjava.lang.refle......
  • Java 并发编程解析 | 如何正确理解Java领域中的锁机制,我们一般需要掌握哪些理论知识?
    苍穹之边,浩瀚之挚,眰恦之美;悟心悟性,善始善终,惟善惟道!——朝槿《朝槿兮年说》写在开头提起Java领域中的锁,是否有种“道不尽红尘奢恋,诉不完人间恩怨“的”感同身受“......
  • java学习笔记018 反射
    1.java.lang.Class获取Class对象的四种方式//1Classclazz1=Person.class;//2Personp=newPerson();Classclazz2=p.getClass();//3 用得多Classclazz3=......
  • Zookeeper选举机制(需掌握)
    1.第一次启动zk集群第一次启动的时候,每一个server会根据myid的大小进行投票选举,如果有半数以上的server投票选择了同一个节点,那么这个节点就会成为leader,剩余的节点全部......
  • 面试~jvm(JVM内存结构、类加载、双亲委派机制、对象分配,了解垃圾回收)
    一、JVM内存结构▷谈及内存结构各个部分的数据交互过程:还可以再谈及生命周期、数据共享;是否GC、是否OOM答:jvm内存结构包括程序计数器、虚拟机栈、本地方法栈、堆、方......
  • Spring事务传播机制理解
    REQUIRED:如果当前没有事务,则自己新建一个事务,如果当前存在事务,则加入这个事务。REQUIRES_NEW:主事务和里面的事务独。SUPPORTS:当前存在事务,则加入当前事务,如果当前没有事务,......
  • 浏览器的缓存机制
    1、概述浏览器的缓存机制就是http缓存机制,是根据请求报文和响应报文的缓存标识来进行的。2、缓存过程浏览器缓存的关键:浏览器每次发起请求,都会先在浏览器缓存中查找该......
  • 17 | JAVA反射之调用方法
    反射调用方法获得Method对象我们已经能通过Class实例获取所有Field对象,同样的,可以通过Class实例获取所有Method信息。Class类提供了以下几个方法来获取Method:Method......