精华内容
下载资源
问答
  • class DemoTest{ ... private String name="123";  public getName(){  system.out.println("public getName " + name);  return name;  }  private getName2(){  syst

    class DemoTest{

       private String name="123";

       public getName(){

           system.out.println("public getName " + name);

           return name;

       }

       private getName2(){

           system.out.println("private getName2 " + name);

          return name;

       }

    }

     

    如这个,要改变name的值。如何改变。通过java反射如何改变

     

    先来看看如何用反射来调用getName方法

    class<DemoTest> calzz=DemoTest.class;

    Constructor cons=clazz.getConstructor(new class[]{});//这个是得到class对象的构造方法。参数为构造方法的参数的类的对象。

    如:DemoTest有一个构造方法为public DemoTest(String arg0,String arg1){......}

    这时,Constructor cons=clazz.getConstructor(new class[]{String.class,String.class});两个String.calss分别对应arg0,arg1.

    接下来是:

    DemoTest test=(DemoTest)cons.newInstance(new Object[]{});//生成相应的对象。参数new Object[]{} 就是构造方法对应的参数的具体值。如刚才的:

    DemoTest test=(DemoTest)cons.newInstance(new Object[]{“李车”,"张三"});

    接下来:

    Method method=clazz.getMethod("getName",new Class[]{String.class});

    method.invoke(test,new Object[]{"王五"});

    这时就可以打印出王五了。

     

    那要如何把name为private 的值进行改变呢。

    1。先得到field,

    Field field=clazz.getDeclaredField("name");

    2.将此对象的 accessible 标志设置为指示的布尔值。值为 true 则指示反射的对象在使用时应该取消 Java 语言访问检查。值为 false 则指示反射的对象应该实施 Java 语言访问检查。

    field.setAccessible(true);

    3.对变量值进行修改

    field.set("name","王五");

     

    OK;

     

    要访问私有的方法也是一样。

     

    Method method=clazz.getDeclaredMethod("getName2");

    method.setAccessible(true);

    method.invoke(test,new Object[]{"王五"});


    用getDeclaredFields就能得到private 和public protend protected 的字段 
    如果用c.getFields();只能得到public类型的属性 

    展开全文
  • 细话Java:"失效"的private修饰符
    展开全文
  • 一般在其他类中是不能这个得到类中private属性和访问private方法的,但天无绝人之路,java强大的反射机制可以完成这个任务。 建一个测试类A: package com.shao.test; public class A { private String testStr...

        一般在其他类中是不能这个得到类中private属性和访问private方法的,但天无绝人之路,java强大的反射机制可以完成这个任务。

    建一个测试类A:

    package com.shao.test;
    
    public class A {
        private String testStr="just for test";
        private void get(int index,String value){
            System.out.println(index+":"+value+" and testStr:"+testStr);
        }
    }
    


    现在我们来访问A中的testStr属性和get方法:

    package com.shao.test;
    
    import java.lang.reflect.Field;
    import java.lang.reflect.InvocationTargetException;
    import java.lang.reflect.Method;
    
    public class B {
    	  public static void main(String[]args) throws ClassNotFoundException, NoSuchFieldException, IllegalArgumentException, IllegalAccessException, NoSuchMethodException, InvocationTargetException{
    	        Field field=Class.forName("com.shao.test.A").getDeclaredField("testStr");
    	        field.setAccessible(true);
    	        A a=new A();
    	        System.out.println(field.getType().toString());   //print:class java.lang.String
    	        System.out.println(field.getName());              //print:testStr
    	        System.out.println(field.getModifiers());         //print:2
    	        Object s=field.get(a);
    	        System.out.println(s);                            //print:just for test
    	        String x="Hello";
    	        field.set(a, x);
    	        System.out.println(field.get(a));                 //print:Hello
    	        Method method=Class.forName("com.shao.test.A").getDeclaredMethod("get", new Class[]{int.class,String.class});
    	        method.setAccessible(true);
    	        method.invoke(a, 3,"apples");   //print:3:apples and testStr:Hello
    	    }
    }
    

    属性使用Filed类获取,方法使用Method类去调用。


    展开全文
  • JAVA类中的private属性能否被继承

    千次阅读 2016-06-06 17:45:52
    讨论的问题:类中private属性能否被继承? 验证过程: 1.分别建立三个类Test1/Test2/Test3,类Test2继承Test1,Test3与Test2为空类. 2.给这三个类分别new一个对象,并比较各对象的空间大小. 3.结果猜测:如果Test1==Test2>...

    java基础

    讨论的问题:类中private属性能否被继承?

    验证过程:

    1.分别建立三个类Test1/Test2/Test3,类Test2继承Test1,Test3与Test2为空类.

    2.给这三个类分别new一个对象,并比较各对象的空间大小.

    3.结果猜测:如果Test1==Test2>Test3则命题成立;如果Test1>Test2==Test3,则命题不成立.

    上代码:(参考:http://my.oschina.net/xianggao/blog/361584)

    import java.lang.instrument.Instrumentation;  
    import java.lang.reflect.Array;  
    import java.lang.reflect.Field;  
    import java.lang.reflect.Modifier;  
    import java.util.IdentityHashMap;  
    import java.util.Map;  
    import java.util.Stack;  
    
    public class MySizeOf {  
    
        static Instrumentation inst;  
    
        public static void premain(String agentArgs, Instrumentation instP) {  
           inst = instP;  
        }  
    
        public static long sizeOf(Object o) {  
           if(inst == null) {  
              throw new IllegalStateException("Can not access instrumentation environment.\n" +  
                 "Please check if jar file containing SizeOfAgent class is \n" +  
                 "specified in the java's \"-javaagent\" command line argument.");  
           }  
           return inst.getObjectSize(o);  
        }  
    
       /**
        * 递归计算当前对象占用空间总大小,包括当前类和超类的实例字段大小以及实例字段引用对象大小
        */
        public static long fullSizeOf(Object obj) {//深入检索对象,并计算大小  
           Map<Object, Object> visited = new IdentityHashMap<Object, Object>();  
           Stack<Object> stack = new Stack<Object>();  
           long result = internalSizeOf(obj, stack, visited);  
           while (!stack.isEmpty()) {//通过栈进行遍历  
              result += internalSizeOf(stack.pop(), stack, visited);  
           }  
           visited.clear();  
           return result;  
        }  
        //判定哪些是需要跳过的  
        private static boolean skipObject(Object obj, Map<Object, Object> visited) {  
           if (obj instanceof String) {  
              if (obj == ((String) obj).intern()) {  
                 return true;  
              }  
           }  
           return (obj == null) || visited.containsKey(obj);  
        }  
    
        private static long internalSizeOf(Object obj, Stack<Object> stack, Map<Object, Object> visited) {  
           if (skipObject(obj, visited)) {//跳过常量池对象、跳过已经访问过的对象  
               return 0;  
           }  
           visited.put(obj, null);//将当前对象放入栈中  
           long result = 0;  
           result += sizeOf(obj);  
           Class <?>clazz = obj.getClass();  
           if (clazz.isArray()) {//如果数组  
               if(clazz.getName().length() != 2) {// skip primitive type array  
                  int length =  Array.getLength(obj);  
                  for (int i = 0; i < length; i++) {  
                     stack.add(Array.get(obj, i));  
                  }  
               }  
               return result;  
           }  
           return getNodeSize(clazz , result , obj , stack);  
       }  
    
       //这个方法获取非数组对象自身的大小,并且可以向父类进行向上搜索  
       private static long getNodeSize(Class <?>clazz , long result , Object obj , Stack<Object> stack) {  
          while (clazz != null) {  
              Field[] fields = clazz.getDeclaredFields();  
              for (Field field : fields) {  
                  if (!Modifier.isStatic(field.getModifiers())) {//这里抛开静态属性  
                       if (field.getType().isPrimitive()) {//这里抛开基本关键字(因为基本关键字在调用java默认提供的方法就已经计算过了)  
                           continue;  
                       }else {  
                           field.setAccessible(true);  
                          try {  
                               Object objectToAdd = field.get(obj);  
                               if (objectToAdd != null) {  
                                      stack.add(objectToAdd);//将对象放入栈中,一遍弹出后继续检索  
                               }  
                           } catch (IllegalAccessException ex) {   
                               assert false;  
                      }  
                  }  
              }  
          }  
          clazz = clazz.getSuperclass();//找父类class,直到没有父类  
       }  
       return result;  
      }  
    }

    主函数:

    class Test1 //24
    {
    	private int a=1;
    	private long aa=1l;
    	
    }
    
    class	Test2 extends Test1 //32
    {
    }
    class	Test3 
    {
    }
    public class TestSize {
    	   public static void main(String []args) {
    	   System.out.println(MySizeOf.fullSizeOf(new Test1()));//打印Test1对象的大小
    	   System.out.println(MySizeOf.fullSizeOf(new Test2()));//打印Test2对象的大小
    	   System.out.println(MySizeOf.fullSizeOf(new Test3()));//打印Test3对象的大小
    	} 
    }

    执行及结果:

    1.先打包类MySizeOf.

    2.编译执行结果如下:


    结论:类的private的属性可以被继承.



    展开全文
  • 因为项目需要用到,于是简单封装了一些常用的操作: ... * 根据属性获取属性值   * */   private Object getFieldValueByName(String fieldName, Object o) {   try {   Strin
  • 转载自 linshutao博客 ... 因为项目需要用到,于是简单封装了一些常用的操作: .../** * 根据属性获取属性值 * */ private Object getFieldValueByName(String fieldName, Object o) { 
  • Java中子类能够继承父类的private属性或方法吗

    万次阅读 多人点赞 2017-01-13 09:32:15
    Java中子类能够继承父类的private属性或方法吗 小宇roGF76BR | 浏览 598 次 发布于2016-07-05 14:26 最佳答案 子类继承父类,子类拥有了父类的所有属性和方法。  程序验证,父类的私有...
  • private Long id; private Integer age; private int shengao; private Byte sex; private String name; private String EName; private Company company; public int getShengao() { return shengao;
  • * 获取对象属性,返回一个字符串数组 * * @param o 对象 * @return String[] 字符串数组 */ private String[] getFiledName(Object o) { try { Field[] fields = o.getClass().getDeclaredFields(); .....
  • java中我们常用到写文件,那我们怎么样获取一直对象的属性名称、值、类型 /** * 根据属性获取属性值 * */ private Object getFieldValueByName(String fieldName, Object o) { try { String first...
  • 为什么Java属性private封装?

    千次阅读 2018-10-19 21:12:51
    getA:主要用于属性内容的获取。 范例: class Person { private String name ; private int age ; public String getName ( ) { return name ; } public void setName ( ...
  • Java反射获取属性问题

    2016-12-30 14:14:28
    1、Java自带的反射机制可获取Class的属性 注意:获取实体类的所有属性,返回Field数组,获取的Field不是类中定义的顺序的 ListitemData = new ArrayList(); Field[] field = payListBean.getClass()....
  • 首先我们明确一下“继承”一词的概念,在 Java 中,继承一词的意义是有限制的。一个子类只能继承其父类的可访问的成员,并且该子类没有覆盖或者说隐藏父类中的那些可访问成员。所以,一个类的成员就是指在这个类中所...
  • java注解使用、java获取注解的属性、获取注解的字段值   一、前言 1、前面一直讲注解的基础知识,注解的定义,对于注解的使用几乎是一笔略过,本篇将着重讲讲注解的使用。 获取注解的属性,通过反射获取注解的...
  • Java 反射获取私有属性和方法

    千次阅读 2019-01-31 17:40:14
    Java 反射获取私有属性和方法 马上过年了,深海祝看到这篇博客的码农朋友新年快乐! 今天下午公司没什么事情,所以写了点小东西,算是给各位的新年小礼物... /* *作者:赵星海 (CSDN-深海呐) *时间:2019/1/31 17:17...
  • Java反射获取private属性和方法(子类,父类,祖先….)先来看一个例子:String可变还是不可变?大家都应该知道,或者听过,String类是不可变的,为什么呢?因为String其实使用一个 private final char [] value;来...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 470,190
精华内容 188,076
关键字:

java获取private属性

java 订阅