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对象,我们就可以使用 ...
随机推荐
- 【iOS开发系列】XIB IBOutlets use strong or weak ?
有人问.在ARC下,IBOutlets究竟应该定义成strong 还是 weak ?支持这个答案的人最多.答案仅是摘自官方文档的一个片段: From a practical perspective, ...
- Android圆角Tag控件的另类实现
一般的圆角标签控件都是用xml设置shape做实现.可是假设我们想要做一个更加强大通用的的圆角控件,不须要使用者去关心圆角,仅仅设置背景就能够了. 应该怎么实现呢?这个就须要把背景先设置成图片,然后再 ...
- caioj1496: [视频]基于连通性状态压缩的动态规划问题:Manhattan Wiring
%%%%orz苏大佬 虽然苏大佬的baff吸不得,苏大佬的梦信不得,但是膜苏大佬是少不得的囧 这题还是比较有收获的 哼居然有我不会做的插头DP 自己yy了下,2表示属于2的插头,3表示3的插头 假如当 ...
- c++ std
高中只是听说过stl,每次问老师老师都会说“有毒,千万别学”,于是stl有毒的言论深深的印在我脑海,看到就恐惧,于是一直没有学,但是大学后确实很多用到stl的地方必须去学习了. 现在想想老师当年的说法 ...
- 解决Highcharts指针偏离的问题
Highcharts 在初始化3D柱状图 时 (注意:3D图形会发生偏移,2D显示正常) 如果加入 shared: true,属性,则可能会导致柱 状图 toolTip提示框偏移,解决方法是去掉或注释 ...
- 2.linux系统命令详解
1 shell shell:命令解释器,根据输入的命令执行相应命令. 1.1 shell家族 察看当前系统下有哪些shell: cat /etc/shells 察看当前系统正在使用的shell ech ...
- crawler4j图片爬虫
该实例主要演示下如何爬取指定网站的图片: 代码中有详细注释: 首先写一个ImageCrawler类: package com.demo.imageCrawler4j; import java.io.F ...
- Flask上下文管理机制
前引 在了解flask上下文管理机制之前,先来一波必知必会的知识点. 面向对象双下方法 首先,先来聊一聊面向对象中的一些特殊的双下划线方法,比如__call__.__getattr__系列.__get ...
- SecurityManager USE
import java.io.DataInputStream; import java.io.File; import java.io.FileInputStream; import java.io. ...
- java中常用的转义字符
Day02_SHJavaTraing_4-3-2017 Java中允许使用转义字符‘\’来将其后的字符转变为特殊字符型常量. 一.JAVA中常用的转义字符