14、反射(reflect)
一、反射概念
不用实例化也可以调用类中的私有成员;反射慢,实例化快;反射可以看到其他类中的内部构造,透明,但是不安全。
JAR:JAVA函数库
WAR:web发布的包
YAR:RPC服务
二、idea打jar
首先将需要当jar包的类全都public,然后点击右上角的
图标,在Artifacts栏中选中一个主类方法,同意所添加的项目,ok。
然后点击菜单栏中的Build下的build project,将jar包加入obj目录下。
在自己的项目下新建包lib,将刚才加入到obj中的jar包复制到lib中,然后再次点击第一步中的图标,在libraries中选择刚才这个jar,添加即可。
三、反射具体操作
1、将所需要创建的类都打包称为jar
2、在方法中写入如下类似代码(c为运行时类)类——>运行时类——>对象(默认构造器反射)
private static void reflectConstructor() {
//类 运行时类 对象
try {
Class c = Class.forName("com.zxc.N1.Animal");
Object o = c.newInstance();
Animal a = (Animal) o;
a.setName("Dog");
System.out.println(a.getName());
} catch (Exception e) {
e.printStackTrace();
}
}
3、非默认构造器反射:参数列表中的三个点表示未知参数个数
private static void reflectNDConstructor(){
try {
Class c=Class.forName("com.zxc.N1.Animal");
Constructor c1=c.getConstructor(int.class,String.class);
Object o=c1.newInstance(12,"Cat");
Animal a=(Animal)o;
System.out.println(a.getName());
} catch(Exception e){
e.printStackTrace();
}
}
4、方法反射:
private static void reflectMethod(){//反射方法
try{
Class c=Class.forName("com.zxc.N1.Animal");
Constructor c1=c.getConstructor(int.class,String.class);
Object o=c1.newInstance(10,"Snake");
Method m=c.getMethod("setName",String.class);
m.invoke(o,"Wolf");
Method m1=c.getMethod("getName");
System.out.println(m1.invoke(o));
// Method ms[]=c.getMethods();
// for(Method e:ms){
// System.out.println(e.getName());
// }
}catch (Exception e){
e.printStackTrace();
}
}
5、属性反射:
private static void reflectAttribute() {//反射属性
try{
Class c=Class.forName("com.zxc.N1.Animal");
Object o=c.newInstance();
Field age=c.getDeclaredField("age");
// age.set(o,12);私有不可访问
age.setAccessible(true);
age.set(o,100);
System.out.println(age.get(o));
// Field []f=c.getFields(); 私有属性看不到
// Field []f=c.getDeclaredFields();//可以看到私有属性
// for(Field f1:f){
// System.out.println(f1.getName());
// }
}catch(Exception e){
e.printStackTrace();
}
}
6、数组反射
private static void reflectArray(){
Object o=Array.newInstance(String.class,3);
Array.set(o,0,"A");
System.out.println(Array.get(o,0));
}
通过反射来扩展一个数组:
public Object growArray(Object array, int size) {
Class type = array.getClass().getComponentType();
Object grown = Array.newInstance(type, size);
System.arraycopy(array, 0, grown, 0,
Math.min(Array.getLength(array), size));
return grown;
}
14、反射(reflect)的更多相关文章
- [Go] 反射 - reflect.ValueOf()
类型 和 接口 由于反射是基于类型系统(type system)的,所以先简单了解一下类型系统. 首先 Golang 是一种静态类型的语言,在编译时每一个变量都有一个类型对应,例如:int, floa ...
- Go语言学习笔记(四)结构体struct & 接口Interface & 反射reflect
加 Golang学习 QQ群共同学习进步成家立业工作 ^-^ 群号:96933959 结构体struct struct 用来自定义复杂数据结构,可以包含多个字段(属性),可以嵌套: go中的struc ...
- go语言之行--接口(interface)、反射(reflect)详解
一.interface简介 interface(接口)是golang最重要的特性之一,Interface类型可以定义一组方法,但是这些不需要实现.并且interface不能包含任何变量. 简单的说: ...
- Golang的反射reflect深入理解和示例
编程语言中反射的概念 在计算机科学领域,反射是指一类应用,它们能够自描述和自控制.也就是说,这类应用通过采用某种机制来实现对自己行为的描述(self-representation)和监测(examin ...
- golang中的反射reflect详解
先重复一遍反射三定律: 1.反射可以将"接口类型变量"转换为"反射类型对象". 2.反射可以将"反射类型对象"转换为"接口类型变量 ...
- Go语言反射reflect
目录 通过反射获取类型信息 理解反射的类型(Type)与种类(Kind) reflect.Elem() - 通过反射获取指针指向的元素类型 通过反射获取结构体的成员类型 通过反射获取值信息 使用反射值 ...
- Java框架基础——反射(reflect)
一.Class类的使用 1)在面向对象(oop)的世界里,万事万物皆对象. 在Java中,包括基本的数据类型,都是对象. Class c = int.class;//int 的类类型 那就是说: 类是 ...
- 类的加载到反射reflect
类的加载: 当程序要使用某个类时,如果该类还未被加载到内存中,则系统会通过加载.连接.初始化这三个步骤来实现对这个类进行初始化. 加载: 就是指将class文件加载进入内存,并为之创建一个Class对 ...
- java 反射(reflect)总结,附对象打印工具类
java反射机制认知 java反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性:这种动态获取类的信息以及动态调用对象的方法的 ...
- (java)从零开始之-反射Reflect
反射: 当一个字节码文件加载到内存的时候,jvm会对该字节码进行解剖,然后会创建一个对象的Class对象,把字节码文件的信息全部都存储到该Class对象中,我们只要获取到Class对象,我们就可以使用 ...
随机推荐
- Ant批量处理jmeter脚本
Ant是一个可以把代码从某个地方拿来,编译,再拷贝到某个地方去的构建工具.一时冲动学习一下,顺便王婆卖瓜尝试着处理jmeter的脚本,于是,采坑之旅也从此开始.本文省略ant安装步骤和ant脚本说明, ...
- Linux程序设计学习笔记——异步信号处理机制
转载请注明出处: http://blog.csdn.net/suool/article/details/38453333 Linux常见信号与处理 基本概念 Linux的信号是一种进程间异步的通信机制 ...
- JMX学习笔记(一)-MBean
JMX学习笔记(一)-MBean 标签: jmxstringjavainterfaceexceptionclass 2010-12-07 22:20 15360人阅读 评论(5) 收藏 举报 分类: ...
- Android自己定义控件系列三:自己定义开关button(二)
接上一篇自己定义开关button(一)的内容继续.上一次实现了一个开关button的基本功能.即自己定义了一个控件.开关button,实现了点击切换开关状态的功能.今天我们想在此基础之上.进一步实现触 ...
- 关于Win 10的隐私保护政策
近日.有人责备Win10收集用户信息,事实上这样的指责并不公平,比方:"Privacy Groups Claim Microsoft Uses Windows 10 as Big Broth ...
- 11.QT窗口布局切割
int main(int argc, char *argv[]) { QApplication a(argc, argv); //MainWindow w; //w.show(); //左右分割 7 ...
- Building Block[HDU2818]
Building Block Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total ...
- 自动化框架的两种断言设计(pytest 版)
自动化测试断言失败时,根据不同业务场景,可能需要立即终止或继续执行.这里以 Appium + pytest 为例. 一. 断言失败立即终止 用途一:用例的预期结果是其他用例的前提条件时,assert ...
- angular自定义指令-directive
Directive究竟是个怎么样的一个东西呢?我个人的理解是这样的:将一段html.js封装在一起,形成一个可复用的独立个体,具体特定的功能.下面我们来详细解读一下Directive的一般性用法. v ...
- Unity Android发布“Bundle Identifier has not been set up correctly”
原文:http://answers.unity3d.com/questions/162141/android-bundle-identifier-has-not-been-setup.html