接上一篇文章  JAVA Reflection(反射机制)

动态数组

java.lang.reflect.Array

static Object set(Object array, int index, Object newValue)

Static Object setXxx(Object array, int index, Xxx newValue)

这些方法将一个新值存储到给定位置上的给定数组中。

其中xxx代表boolean、btye 、double、float、int、long、short中的其中一种

static Object get(object array, int index)

static xxx getXxx(Object array, int index)

这些方法将返回存储在给定位置上的给定数组的内容。

动态创建和访问数组元素

import java.lang.reflect.*;
public class ArrayTester1 { public static void main(String args[])throws Exception { Class classType = Class.forName("java.lang.String"); //创建一个长度为 10 的字符串数组 Object array = Array.newInstance(classType, 10); //把索引位置为 5 的元素设为"hello" Array.set(array, 5, "hello"); //读取索引位置为 5 的元素的值 String s = (String) Array.get(array, 5); System.out.println(s); }
}

检查类结构

public static void printConstructors(Class cl) {Constructor[] constructors = cl.getDeclaredConstructors();for (Constructor c : constructors) {String name = c.getName();   System.out.println(" ");String modifiers = Modifier.toString(c.getModifiers());if (modifiers.length() > 0)  System.out.println(modifiers + " ");System.out.println(name + "(");Class[] paramTypes = c.getParameterTypes();for (int j = 0; j < paramTypes.length; j++) {if (j > 0) System.out.println(", ");System.out.println(paramTypes[j].getName());}System.out.println(");");}
}
public static void printMethods(Class cl) {Method[] methods = cl.getDeclaredMethods();for (Method m : methods) {Class retTye = m.getReturnType();String name = m.getName();System.out.print(" ");String modifiers = Modifier.toString(m.getModifiers());if (modifiers.length() > 0) System.out.print(modifiers + " ");System.out.print(retTye.getName() + " " + name + "(");Class[] paramTypes = m.getParameterTypes();for (int j = 0; j < paramTypes.length; j++) {if (j > 0)System.out.print(", ");System.out.print(paramTypes[j].getName());}System.out.println(");");}
}
public static void printFields(Class cl) {Field[] fileds = cl.getDeclaredFields();for (Field f : fileds) {Class type = f.getType();String name = f.getName();System.out.print(" ");String modifiers = Modifier.toString(f.getModifiers());if (modifiers.length() > 0)System.out.print(modifiers + " ");System.out.println(type.getName() + " " + name + ";");}
}
public static void main(String[] args) {String name;if (args.length > 0)name = args[0];else {Scanner in = new Scanner(System.in);System.out.println("Enter class name (e.g. java.util.Date): ");name = in.next();}try {Class cl = Class.forName(name);Class supercl = cl.getSuperclass();String modifiers = Modifier.toString(cl.getModifiers());if (modifiers.length() > 0)System.out.print(modifiers + " ");System.out.print("class " + name);if (supercl != null && supercl != Object.class)System.out.println(" extends " + supercl.getName());System.out.print("\n{\n");printConstructors(cl);System.out.println();printMethods(cl);System.out.println();printFields(cl);System.out.println("}");} catch (ClassNotFoundException e) {e.printStackTrace();}System.exit(0);
}

检查类结构——输出示例

Enter class name (e.g. java.util.Date):
com.ht.Customer
public class com.ht.Customer
{public com.ht.Customer(java.lang.String, int);public com.ht.Customer();public void setId(java.lang.Long);public int getAge();public void setAge(int);public java.lang.String getName();public java.lang.Long getId();public void setName(java.lang.String);private java.lang.Long id;private java.lang.String name;private int age;
}

访问权限控制

public class AccessTester {public static void main(String[] args) {try {Customer customer = new Customer("success", 10);Class cl = customer.getClass();Field f = cl.getDeclaredField("name");Object v = f.get(customer);System.out.printf(v);} catch (Exception e) {e.printStackTrace();}}
}

抛出异常:

java.lang.IllegalAccessException:  Class com.ht.AccessTester can not access

a member of class com.ht.Customer with modifiers "private"

反射机制默认的行为受限制于Java的访问控制。

Java安全机制只允许查看任意对象有哪些值,而不允许读取它们私有域的值。

Java允许通过覆盖访问控制来脱离安全管理器的控制。  setAccessible(true);

java.lang.reflect.AccessibleObject

void setAccessible(boolean flag)

为反射对象设置可访问标志。Flag为true表明屏蔽Java语言的访问检查,使得对象的私有属性也可以被查询和设置。

Boolean isAccessible()

返回反射对象的可访问性标志的值。

static void setAccessible(AccessibleObject[] array, boolean flag)

一种设置对象数组可访问标志的快捷方式

public class AccessTester {public static void main(String[] args) {try {Customer customer = new Customer("success", 10);Class cl = customer.getClass();Field f = cl.getDeclaredField("name");f.setAccessible(true);        Object v = f.get(customer);System.out.println(v);} catch (Exception e) {e.printStackTrace();}}
}

输出:success

java反射小结

1. 只要用到反射,先获取Class Object;

2. 没有方法能够获得当前类的超类的private方法和属性,你必须通过getSuperClass()找到超类以后再去尝试获得;

3. 通常情况即使是当前类,private属性或方法也是不能访问的,你需要设置压制权限setAccessible(true)来去的private的访问权。但是这样已经破坏了面向对象的规则,所以除非万不得已,尽量少用。建议采用Java Bean 方法,如get***()和set***()。

JAVA Reflection(反射机制)续相关推荐

  1. Java反射机制的基本概念与使用_Java进阶之reflection(反射机制)——反射概念与基础...

    反射机制是Java动态性之一,而说到动态性首先得了解动态语言.那么何为动态语言? 一.动态语言 动态语言,是指程序在运行时可以改变其结构:新的函数可以引进,已有的函数可以被删除等结构上的变化.比如常见 ...

  2. 搞懂Java的反射机制

    搞懂Java的反射机制 1.什么是反射? java的反射机制是指可以在运行状态下获取类和对象的所有属性和方法. 2.反射的作用? 1.在运行时获取一个类/对象的成员变量和方法 2.在运行时创建一个类的 ...

  3. java原理—反射机制

    http://www.cnblogs.com/forlina/archive/2011/06/21/2085849.html 一.什么是反射: 反射的概念是由Smith在1982年首次提出的,主要是指 ...

  4. 学习:java原理—反射机制

    一.什么是反射: 反射的概念是由Smith在1982年首次提出的,主要是指程序可以访问.检测和修改它本身状态或行为的一种能力.这一概念的提 出很快引发了计算机科学领域关于应用反射性的研究.它首先被程序 ...

  5. 什么是Java的反射机制?

    Java 的反射机制是使其具有动态特性的非常关键的一种机制,也是在JavaBean 中广泛应用的一种特性. 运用JavaBean 的最常见的问题是:根据指定的类名,类字段名和所对应的数据,得到该类的实 ...

  6. java中反射机制的含义_java的反射是什么意思?

    反射是Java的特征之一,是一种间接操作目标对象的机制. Java反射机制指的是在Java程序运行状态中,对于任何一个类,都可以获得这个类的所有属性和方法:对于给定的一个对象,都能够调用它的任意一个属 ...

  7. 浅谈java的反射机制

    java的反射机制 JAVA反射机制是在运行状态中,对于任意一个实体类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意方法和属性:这种动态获取信息以及动态调用对象方法的功能称为 ...

  8. Java的反射机制 —— 类的镜子

    Java的反射机制 -- 类的镜子 文章目录 Java的反射机制 -- 类的镜子 一.反射机制的原理 1.1.什么是反射? 1.2.反射机制的实现 1.3.获取类的Class对象的途径 1.4.运行时 ...

  9. Java的反射机制 工厂模式综合讲解【转载自51CTO】

    2019独角兽企业重金招聘Python工程师标准>>> Java的反射机制 工厂模式综合讲解 1.什么叫反射 Java.lang.reflect包下 正常情况下我们可以通过类实例化一 ...

  10. java xml 反射_Java 读取XML文件以及Java 的反射机制实现

    Java 读取XML文件以及Java 的反射机制实现 代码部分 import java.io.File; import javax.xml.parsers.DocumentBuilder; impor ...

最新文章

  1. Python基础11-函数式编程与内置函数
  2. CVPR 2021 | 论文大盘点:3D目标检测
  3. R语言使用rpart包构建决策树模型、使用prune函数进行树的剪枝、交叉验证预防过拟合、plotcp可视化复杂度、rpart.plot包可视化决策树、使用table函数计算混淆矩阵评估分类模型性能
  4. FAST选址与三维仿真模拟研究
  5. ADSL掉线解决方法全略
  6. C++类型萃取之type_traits和type_info
  7. 【ElasticSearch】Es 源码之 UsageService 源码解读
  8. HDU1863 畅通工程【Kruskal算法+并查集】
  9. ai决策_基于经验的决策与基于事实的决策:AI / ML如何改变工程师的工作方式
  10. 2012Google校园招聘笔试题
  11. 单片机技术与c语言编程教学大纲,《单片机原理及应用》课程教学大纲
  12. po是什么意思java_PO/VO/DAO/BO/POJO是什么(JAVA 的解釋)
  13. 为什么在Excel文档单元格中输入长段数字就变为公式?干货来啦!如何解决在excel单元格中输入数字变为公式的问题?
  14. iPhone自定义铃声(iOS12 + iTunes in macOS Mojave)
  15. 彪悍晨读 | 每天价值投资常识
  16. 万顿思电商:拼多多推广是如何收费的?
  17. 解一元二次方程——Java
  18. 解决vmware下虚拟机关机重启ip改变
  19. 高中英语话题阅读 计算机,高中英语必修二Unit 3 Computers阅读课的教学设计
  20. javaGUI绘图频闪

热门文章

  1. Pytorch:手动求导和autograd的计算对比
  2. 生成二维码并以图片格式下载-qrcodejs2
  3. 让远程传输大文件变得更快
  4. Bootstrap-基于jquery的bootstrap在线文本编辑器插件Summernote
  5. struts_login实例
  6. make_smbcodepage - 为Samba创建代码页文件
  7. React源码之 从开始说起
  8. OO_2019_第一单元总结——表达式求导
  9. CodeForces 877C
  10. Spring的注解问题