四大神器之反射(二)

利用反射来操纵数组

import java.lang.reflect.Array;

/**
 *
 * 利用反射来操纵数组
 */
public class ArrayTester {

    public static void main(String[] args) throws ClassNotFoundException {
        Class classType = Class.forName("java.lang.String");

        Object array = Array.newInstance(classType, 10);//创建具有指定组件类型和尺寸的新数组。

        Array.set(array,5,"hello");

        String str =(String) Array.get(array,5);

        System.out.println(str);

    }
}

我们可以注意到java.lang.reflect.array中可以对数组进行更改,创建数组。

对于二维甚至是三维数组,我们照样可以进行改变。

public class ArrayTester2 {

    public static void main(String[] args) {
        int[] dims = new int[]{5, 10, 15};

        Object array = Array.newInstance(int.class, dims);

        Object arrayObj = Array.get(array, 3);
        //此时的arrayObj是一个二维数组

        Class<?> cls = arrayObj.getClass().getComponentType();

        arrayObj = Array.get(arrayObj, 5);
        //此时的arrayObj是一个一维数组

        Array.set(arrayObj, 10, 37);

        int[][][] arrayCast = (int[][][]) array;

        System.out.println(arrayCast[3][5][10]);
    }
 

可以注意到,第8行已经是一个二维数组进行get取值,第13行是一个一维数组来进行取值。

这一些代码是为了在3维数组中 将第三第五和第十取值为37.

这里有一个面试题,如何在一个方法中改变私有的属性,提供get方法。

public class PrivateTest {

    private String name = "hello";

    public String getName(){
        return this.name;
    }

从上面这个类中如何改变name的属性值?

public class ReflectionTest {
    public static void main(String[] args) throws Exception {
        PrivateTest pt = new PrivateTest();

        Class<?> clazz = PrivateTest.class;

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

        field.setAccessible(true);
        //压制java的访问控制检查

        System.out.println(field.get(pt));

        field.set(pt,"world");

        System.out.println(pt.getName());
    }
}

上面代码中,关键的一点是需要压制java的访问控制检查,如果不去压制,那么将会访问不到那个属性值,也就无法

更改为world,这其中利用了Java的反射机制,非常方便的就可以改变私有的属性值。

原文地址:https://www.cnblogs.com/xiaobaoa/p/12178521.html

时间: 2024-10-17 22:41:11

四大神器之反射(二)的相关文章

四大神器之反射

Java反射机制,是一个基础的内容章节,在对于之后的框架学习中起到了至关重要的作用,现在比较流行的是spring 框架 ,其中的IOC(自动注入)以及AOP(动态代理),在AOC中代理模式又分为动态代理和byteCode instrument(插桩)或者是CGLIB . 在学习Java反射机制前,首先问一个问题:在Java运行时,对于任意一个类,能否知道这个类有那些属性和方法?对 于任意一个对象,能否调用它任意一个方法? 答案是肯定的.可以! 在这里要去区别一个事情:如果说在自己写的类中去改一个

让程序猿不再苦逼的四大神器

做程序猿「媛」是一个苦逼的活,大周六地早起在技术群里招呼.看到没有啥人响应,说了一句.「预计都没有醒」.然后一位哥们抛过来,「在加班」 ! 做 Web 开发更是一个苦逼的活.不像是做 iOS,搞定client.基本上就万事大吉了. 做 Web 开发不仅仅是要做后端.前端也须要了解和熟悉! 做前后端通吃的 DevOps 全栈project师绝对是最苦逼的活,不但须要做开发,而且还要了解运维.优化.不会运维的project师绝对不是一个好架构师. 但所幸的事.一个优秀的project师虽然非常忙,虽

破解NET的四大神器(转)

原文地址 原本这篇文章可以更早一星期写出来与大家分享,由于某方面的原因耽搁到现在,心里竟有那么一点好像对不住大家的感觉.这当然与神器有关,因为我发现利用这四大神器我似乎觉得几乎所有的NET程序破解都不在话下了.而我竟然在发现这神器组合后推迟了一周才分享与大家! 在开始分享之前,还是要说明一点,说是神器到目前为止也仅仅是对我自己而言,至于这四大神器会不会成为对各位而言的神器就不得而言了,因此当有哪位亲拿到这四大神器后仍然感到破解NET程序存在很大困难,请拍砖. 先介绍一下我眼中的四大神器:De4D

入门反射(二)

原文:入门反射(二) 这篇来看一下反射的使用吧!举个例子! 举例子,肯定需要一个类啦,先建一个学生例子类: public class Student { public int Status; public int Id { get; set; } public string Name { get; set; } public string Sex { get; set; } public void Show() { Console.WriteLine("姓名:{0}", Name);

C#反射(二)

长时间没有回顾反射知识了,今天就讲解一下反射的一般第二个用法. 二.对方法,属性等的反射 首先需要写一个测试类,生成.exe或.dll文件. class Test {   public Test()//普通构造方法 {   } public string writeString(string s)//有参方法 {   return "welcome:" + s;  } public static string staticString(string s)//静态方法 {   retur

元数据与反射(二)

1.反射程序集 获取Assmbly对象有以下方法: (1)Assmbly.Load("程序集文件名称") Assembly assembly = Assembly.Load("类库Demo"); (2)Assmbly.LoadFrom("程序集文件名") Assembly assembly = Assembly.LoadFrom("类库Demo.dll"); 上述两个方法的区别就在于Load只需要提供文件名不加后缀的信息即可.

C#反射(二) 【转】

如果没有看<C#反射(一)>.建议先看<C#反射(一)>再看这一篇.上一篇文章发表,有人评论我所写的东西比较基础.其实我也知道我也只不过是在写最基础的语法而已,之所以写它是因为自己学编程学了一两年之后才接触到反射,相信会有很多人跟我有过同样的经历.概其原因,书店里几乎90%的书籍都不谈反射.还有,曾经在百度.goole搜索过反射,但也很难找到自己喜欢的答案.希望我所写的东西能为那些初学编程的新手有所帮助. 我不想在这里过多的描述反射的概念.我还是用我自己觉得最简单.最直接的语言来描

四大组件之Activity(二)

人生是一场旅行,在乎的不是目的地,是沿途的风景以及看风景的心情. 本讲内容:Activity用法 一.活动被回收了怎么办? 当一个活动进入了停止状态,是有可能被系统回收的.如果一个应用有一个活动A,用户在活动A启动活动B,活动A就进入了停止状态,这个时候由于系统内存不足,将活动A回收掉,如果用户按下Back键返回活动A,这里不会执行onRestart()方法,而是执行活动A的onCreate()方法重新创建一次.但是如果活动A是可能存在临时数据和状态的,譬如:活动A中有一个文本框,现在你输入了一

跟我学Java反射——二步曲

上一篇文章我们已经将反射的基本知识和class类以及类的加载器进行了介绍,在上一篇我们还学习了四种得到Class类对象的方式,但是有了class对象我们能做些什么呢,学习完这篇文章,就可以得到答案了. 获取类的完整结构 这篇文章我们主要通过demo来学习,我先将demo需要用到的代码进行简单介绍. 一个接口MyInterface代码: package com.tgb.reflect.common; import java.io.Serializable; public interface MyI