Java内存理解 && 反射访问私有属性或方法

理解了内存,就理解了一切,就理解了各种各样的语言。所有的语言无非都是这样:局部变量分配内存永远在栈里面,new出来的东西分配内存永远是在堆里,静态的东西分配内存永远是在数据区。剩下的代码肯定是在代码区。所有的语言都是这样。

对于在API文档里面找某个类,如果一个类不用引入包就可以直接使用,那么这个类肯定是在java.lang这个包里。

接口是抽象方法(public)和常量值(public static final)的集合。

抽象类一定要有abstract关键字。

Java反射之访问私有属性或方法

参考来源

AccessibleObject类是Field、Method、和Constructor对象的基类。它提供了将反射的对象标记为在使用时取消默认Java语言访问控制检查的能力。对于公共成员、默认(打包)访问成员、受保护成员和私有成员,在分别使用Field、Method和Constructor对象来设置或获得字段、调用方法,或者创建和初始化类的新实例的时候,会执行访问检查。


当反射对象的accessible标志设为true时,则表示反射的对象在使用时应该取消Java语言访问检查。反之则检查。由于JDK的安全检查耗时较多,所以通过setAccessible(true)的方式关闭安全检查来提升反射速度。


import java.lang.reflect.Field;
import java.lang.reflect.Method;  

/**
 * 用Java反射机制来调用private方法
 * @author WalkingDog
 *
 */  

public class Reflect {  

    public static void main(String[] args) throws Exception {  

        //直接创建对象
        Person person = new Person();  

        Class<?> personType = person.getClass();  

        //访问私有方法
        //getDeclaredMethod可以获取到所有方法,而getMethod只能获取public
        Method method = personType.getDeclaredMethod("say", String.class);  

        //压制Java对访问修饰符的检查
        method.setAccessible(true);  

        //调用方法;person为所在对象
        method.invoke(person, "Hello World !");  

        //访问私有属性
        Field field = personType.getDeclaredField("name");  

        field.setAccessible(true);  

        //为属性设置值;person为所在对象
        field.set(person, "WalkingDog");  

        System.out.println("The Value Of The Field is : " + person.getName());  

    }
}  

//JavaBean
class Person{
    private String name;  

    //每个JavaBean都应该实现无参构造方法
    public Person() {}  

    public String getName() {
        return name;
    }  

    private void say(String message){
        System.out.println("You want to say : " + message);
    }
}
时间: 2024-10-12 04:09:27

Java内存理解 && 反射访问私有属性或方法的相关文章

如何通过反射修改私有属性的值,附代码

在Java中使用反射修改私有属性 Integer a = Integer.valueOf(1); // TODO Field f = a.getClass().getDeclaredField("value"); f.setAccessible(true); f.set(a,2); System.out.println(a.intValue()); // 输出2 参考链接 https://blog.csdn.net/tabactivity/article/details/5072635

Java中子类继承了父类的私有属性及方法吗?

最近学习继承,从书中看到子类继承父类,子类拥有父类所有的属性和方法,于是使用程序去验证,发现父类的私有属性和私有方法,子类是不能访问的,当然一些父类的私有属性可能可以通过相应的方法访问到,但是私有的方法似乎不能简单的访问,这里暂不考虑Java反射机制,于是我分析,子类不能继承父类私有的属性及方法,但是分析了内存后,我发现我是错的,在一个子类被创建的时候,首先会在内存中创建一个父类对象,然后在父类对象外部放上子类独有的属性,两者合起来形成一个子类的对象.所以所谓的继承使子类拥有父类所有的属性和方法

Java 反射调用私有域和方法(setAccessible)

Java 反射调用私有域和方法(setAccessible) @author ixenos AccessibleObject类 Method.Field和Constructor类共同继承了AccessibleObject类,该基类有两个setAccessible方法能在运行时压制Java语言访问控制检查(Java language access control checks),从而能任意调用被私有化保护的方法.域和构造方法 public class AccessibleObjectextends

php 对象直接访问私有属性

<?php header("content-type:text/html;charset=UTF-8"); class Person{ //私有的成员属性,对直接访问象 private $name; private $age; private $sex; //魔术方法 __construct(), __set(), __unset(), __isset(), __unset()..... function __construct($name="name1",$

JAVA中的反射只获取属性的get方法

JAVA中的反射只获取属性的get方法 在开发过程中,我们经常需要获取类中某些属性的get方法,此时我们需要使用到反射,例如,我们在获得一个对象后,需要知道该对象的哪些属性有值,哪些没有值,方便我们后面的处理. 譬如在我们拼SQL语句时,就需要知道哪些字段为空或为NULL,此时我们在拼语句的时候需要剔除掉,若是我们采用一般的判断的办法,则会很复杂(需要处理好SQL中的AND关键字的有无 ),当然,我们也有另外的解决办法(例如将非空的键和值存入map中,再将map存入list集合中,然后循环集合做

反射——反射访问私有成员

//BindingFlags.NonPublic | BindingFlags.Instance标志枚举,用于访问私有成员 namespace 通过反射访问私有成员 { class Program { static void Main(string[] args) { Type getMoth = typeof(person); MethodInfo info = getMoth.GetMethod("SayHi",BindingFlags.NonPublic | BindingFla

java的接口、类、属性、方法各有哪些修饰符

参考博客:http://blog.csdn.net/cao_tao199612/article/details/7458245 1. 接口的修饰符只有:public 2. 类的修饰符分为:可访问控制符和非访问控制符两种. 可访问控制符是:公共类修饰符 public 非访问控制符有:抽象类修饰符 abstract :最终类修饰符 final 1.公共类修饰符 public : Java 语言中类 的可访问控制符只有一个: public 即公共的.每个 Java 程序的主类都必须是 public 类

JavaScript基础对象创建模式之私有属性和方法(024)

JavaScript没有特殊的语法来表示对象的私有属性和方法,默认的情况下,所有的属性和方法都是公有的.如下面用字面声明的对象: var myobj = { myprop: 1, getProp: function () { return this.myprop; } }; console.log(myobj.myprop); // `myprop` is publicly accessible console.log(myobj.getProp()); // getProp() is publ

Java反射设置和访问私有属性值

越学习到后面,越感觉java反射机制很重要,必须精通,要不框架那块比较难自己动手实现,回过头温习一下反射机制,查漏补缺 今天尝试了一下通过反射访问和设置类的私有属性(不设置settesr和getters),比较容易理解,代码一贴就知道了 下面是po代码: package cn.liangqinghai.reflect; public class Beans1 { public Beans1(){ System.out.println("无参构造调用"); } public Beans1