zoukankan      html  css  js  c++  java
  • JAVA反射机制的小记

    本文摘自《Spring 3.x 企业应用开发实战》

    Java还为包提供了Package反射类,在JDK 5.0中还为注解提供了AnnotatedElement反射类。总之,Java的反射体系保证了可以通过程序化的方式访问目标类中所有的元素,对于private或protected的成员变量和方法,只要JVM的安全机制允许,也可以通过反射进行调用。例子如下。

    package com.baobaotao.reflect;
    public class PrivateCar {
           //①private成员变量:使用传统的类实例调用方式,只能在本类中访问
       private String color; 
            //②protected方法:使用传统的类实例调用方式,只能在子类和本包中访问
       protected void drive(){
    	   
    System.out.println("drive private car! the color is:"+color);
       }
    }
    
    public class PrivateCarReflect {
       public static void main(String[] args) throws Throwable{
    	   ClassLoader loader = Thread.currentThread().getContextClassLoader();
    	   Class clazz = loader.loadClass("com.baobaotao.reflect.PrivateCar");
    	   PrivateCar pcar = (PrivateCar)clazz.newInstance();
    	   
    	   Field colorFld = clazz.getDeclaredField("color");
            //①取消Java语言访问检查以访问private变量
    	   colorFld.setAccessible(true); 
    	   colorFld.set(pcar,"红色");
    	   
    	   Method driveMtd = clazz.getDeclaredMethod("drive",(Class[])null);
            //Method driveMtd = clazz.getDeclaredMethod("drive"); JDK5.0下使用
           
            //②取消Java语言访问检查以访问protected方法
    	   driveMtd.setAccessible(true); 
            driveMtd.invoke(pcar,(Object[])null);
      }
    }
    

    运行该类,打印出以下信息:

    drive private car! the color is:红色

  • 相关阅读:
    如何处理iOS中照片的方向
    Builder Pattern 在 Objective-C 中的使用
    多线程(三)-- 线程安全问题
    多线程(二)--NSThread基本使用
    多线程 (一)
    报错:Request failed: unacceptable content-type: text/html
    Cocoapods简单安装和使用
    Objective
    Objective
    Python学习笔记(一)--注释
  • 原文地址:https://www.cnblogs.com/shuoli/p/7306729.html
Copyright © 2011-2022 走看看