zoukankan      html  css  js  c++  java
  • JAVA连载117-反射的应用与打破封装新

    一、反射的概念

    1.反射的概念是有Smith在1982年首次提出,主要是指程序可以访问、检测和修改它本身状态或者行为的一种能力,并且根据自身行为的状态和结果,调整或者修改应用所描述行为的状态和相关的语义。

    2.Java中,反射是一种强大的工具,它使您能够创建灵活的代码,这些代码可以在运行时进行装配,无需在组件中进行源代码的链接。

    3.反射允许我们在编写与执行的时候,使我们的代码能够装载到JVM中的类的内部信息,而不是源代码中选定的类协作的代码,这使得放射成为构建灵活的应用的主要工具,但是需要主要注意的是,如果使用不当,会造成不可预知的结果。​

    package com.bjpowernode.java_learning;
    
    import java.util.Properties;
    
    import java.io.*;
    
    import java.util.*;
    
    import java.io.FileReader;
    
    //import com.bjpowernode.java_learning.classInfo.properties;
    public class D116_2_ClassInfo {
    
      public static void main(String[] args) throws Exception{
    
        //1.创建属性对象
    
        Properties p = new Properties();
    
        //2.创建流
    
        String address = "C:\Users\lenovo1\Workspaces\MyEclipse CI\Java_learning\src\com\bjpowernode\java_learning\classInfo.properties";
    
        FileReader fr = new FileReader(address);
    
        //3.加载
    
        p.load(fr);
    
        //4.关闭流
    
        fr.close();
    
        //通过key获取value
    
        String className = p.getProperty("className");
    
        System.out.println(className);
    
        //通过反射机制创建对象
    
        Class c = Class.forName(className);
    
        //创建对象
    
        Object o = c.newInstance();
    
        System.out.println(o);
    
       
    
        //这种方式与我们直接new一个对象有什么优势
    
        //这种方式我们可以在外面设置properties属性文件来达到修改创建对象的方式
    
      }
    
    }

    二、获取某个指定的属性,并且可以打破封装性

    package com.bjpowernode.java_learning;
    
    import java.lang.reflect.*;
    
    ​
    
    public class D117_2_Reflect {
    
      public static void main(String[] args) throws Exception{
    
        //获取一个类
    
        Class c = Class.forName("com.bjpowernode.java_learning.D117_1_Reflect");
    
        //获取id属性
    
        Field idF = c.getDeclaredField("id");
    
    //    System.out.println(idF);
    
       
    
        //获取到某个特定的属性?set,get
    
        Object o = c.newInstance();
    
       
    
        //因为id是private,所以需要打破封装,下面这个方法可以打破权限
    
        idF.setAccessible(true);
    
        //使用反射机制可以打破java程序的封装性,导致了Java对象的属性变得不安全了
    
       
    
        //set方法,void idF.set(Object obj,Object value);
    
        idF.set(o, "004512");//给对象o的idF属性赋上“004512”这个值
    
       
    
       
    
      }
    
    }

    三、源码:

    D117_1_Reflect.java

    D117_2_Reflect.java

    https://github.com/ruigege66/Java/blob/master/D117_1_Reflect.java

    https://github.com/ruigege66/Java/blob/master/D117_2_Reflect.java

    2.CSDN:https://blog.csdn.net/weixin_44630050

    3.博客园:https://www.cnblogs.com/ruigege0000/

    4.欢迎关注微信公众号:傅里叶变换,个人公众号,仅用于学习交流,后台回复”礼包“,获取大数据学习资料

     

  • 相关阅读:
    c#队列的实现
    c#队列的实现
    C# 自定义控件制作和使用实例(winform)
    常见的位运算
    Clock()函数简单使用(C库函数)
    Python全局变量的简单使用
    PyQt5+Caffe+Opencv搭建人脸识别登录界面
    python3+pyqt5+opencv3简单使用
    OpenCV实现人脸检测
    opencv 截图并保存
  • 原文地址:https://www.cnblogs.com/ruigege0000/p/12940653.html
Copyright © 2011-2022 走看看