14、反射(reflect)
2024-08-31 11:37:05
一、反射概念
不用实例化也可以调用类中的私有成员;反射慢,实例化快;反射可以看到其他类中的内部构造,透明,但是不安全。
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; }
最新文章
- canvas初探2
- 原生js+本地储存登录注册
- 关于sharepoint2013的SPUtility.GetGenericSetupPath()方法过期解决办法
- java.lang.IllegalStateException异常简单分析和简单解决
- echarts 折线柱形上方显示自定义格式数据
- 解决DataTable中的DataColumn类型默认为int类型时, 导致不能修改其列值为其他类型的解决办法
- Unity3d开发IOS游戏 基础
- Emacs添加主题插件(Win系统)
- 项目常用Javascript分享,包含常用验证和Cookie操作
- WPF 自定义ItemsControl/ListBox/ListView控件样式
- 在CentOS上安装owncloud企业私有云过程
- thinkphp v5.1 开发笔记
- 六、web应用与Tomcat
- mac chrome 强制刷新浏览器缓存
- 部署tinyproxy代理服务
- Linux 学习笔记之超详细基础linux命令 Part 8
- Sitecore CMS中如何命名项目名称
- java学习路线-从入门到入土
- 20145328《网络对抗技术》Final
- SpringMVC之@RequestParam @RequestBody @RequestHeader 等详解