一、反射概念

 不用实例化也可以调用类中的私有成员;反射慢,实例化快;反射可以看到其他类中的内部构造,透明,但是不安全。

 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;

}

最新文章

  1. canvas初探2
  2. 原生js+本地储存登录注册
  3. 关于sharepoint2013的SPUtility.GetGenericSetupPath()方法过期解决办法
  4. java.lang.IllegalStateException异常简单分析和简单解决
  5. echarts 折线柱形上方显示自定义格式数据
  6. 解决DataTable中的DataColumn类型默认为int类型时, 导致不能修改其列值为其他类型的解决办法
  7. Unity3d开发IOS游戏 基础
  8. Emacs添加主题插件(Win系统)
  9. 项目常用Javascript分享,包含常用验证和Cookie操作
  10. WPF 自定义ItemsControl/ListBox/ListView控件样式
  11. 在CentOS上安装owncloud企业私有云过程
  12. thinkphp v5.1 开发笔记
  13. 六、web应用与Tomcat
  14. mac chrome 强制刷新浏览器缓存
  15. 部署tinyproxy代理服务
  16. Linux 学习笔记之超详细基础linux命令 Part 8
  17. Sitecore CMS中如何命名项目名称
  18. java学习路线-从入门到入土
  19. 20145328《网络对抗技术》Final
  20. SpringMVC之@RequestParam @RequestBody @RequestHeader 等详解

热门文章

  1. 【WaaCaa】一款开源科学作图/数据可视化工具 —— 诞生篇
  2. 高速排序(Java版)
  3. 全面具体介绍一个P2P网贷领域的ERP系统的主要功能
  4. Swift EventKit的初学者指南–请求权限
  5. 杂项:CMM
  6. jQuery插件开发的两种方法
  7. python之路——装饰器函数
  8. mysql授予IP远程访问访问语句
  9. java代码实现python2中aes加密经历
  10. CentOS 7 安装配置MySQL