“程序运行时,容许改变程序结构或变量类型,这种语言称为动态语言”,如Python,Ruby是动态语言;显然C++,Java,C#不是动态语言,可是JAVA有着一个很是突出的动态相关机制:Reflection。java
JAVA反射机制是在运行状态中,对于任意一个类,都可以知道这个类的全部属性和方法;对于任意一个对象,都可以调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。api
如:markdown
/** * 入门级示例:经过对象获取 包名.类名 * @author Administrator */ public class Simple { public static void main(String[] args) { Simple s=new Simple(); System.out.println(s.getClass().getName()); } }
Java反射机制,能够实现如下功能:iphone
①在运行时判断任意一个对象所属的类;ide
②在运行时构造任意一个类的对象;学习
③在运行时判断任意一个类所具备的成员变量和方法;代理
④在运行时调用任意一个对象的方法;code
⑤生成动态代理。对象
相关的api为blog
打开权限:
add.setAccessible(true);
全部类的对象其实都是Class的实例。这个Class实例能够理解为类的模子,就是包含了类的结构信息,相似于图纸。咱们平常生活中,须要创造一个产品,如想山寨一个iphone手机,怎么办?
三种方式能够实现:
⑴买个iphone手机,拆的七零八落的,开始山寨;
⑵到iphone工厂参观,拿到iphone磨具,开始山寨;
⑶跑到美国盗取iphone的图纸,开始山寨,最后一种最暴力,最爽。
序列化:实现serializable接口
反序列化
克隆:实现cloneable接口,重写clone()方法,修改权限为public
New 反射
同理,获取类的class对象,也有三种方式:
①Class.forName(”包名.类名”)//通常尽可能采用该形式
②类.class
③对象.getClass()
示例以下:
public class Source { public static void main(String[] args) { //第一种方式:对象.class Source s=new Source(); Class<?>c1=s.getClass(); //第二种方式:类.class Class<?>c2=Source.class; //第三种方式(推荐方式):Class.forName() Class<?>c3=null; try { c3=Class.forName("com.shsxt.ref.simple.Source"); } catch (ClassNotFoundException e) { e.printStackTrace(); } System.out.println(c1.getName()); System.out.println(c2.getName()); System.out.println(c3.getName()); } }
有了class对象,咱们就有了一切,这就是反射的源头,接下来就是“庖丁解牛”。
PS:获取学习资源技术干货:lezijie007(暗号1024)