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; }