JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于
任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的
方法的功能称为java语言的反射机制。
通过java语言中的反射机制可以操作字节码文件(可以读和修改字节码文件。)
通过反射机制可以操作代码片段。(class文件。)
要想解剖一个类,必须先要获取到该类的字节码文件对象。而解剖使用的就是Class类中的方法.所
以先要获取到每一个字节码文件对应的Class类型的对象.
Class类对象的三种实例化模式:
以下分别举例实现:
public final native Class<?> getClass()
范例:调用getClass()方法
import java.util.Date; public class test { public static void main(String[] args) { Date date=new Date(); System.out.println(date.getClass()); } }
结果:找到对应的类
范例:通过类名找对应的class 文件
import java.util.Date; public class test { public static void main(String[] args) throws Exception{ System.out.println(Date.class); } }
范例:使用Class.forName()方法
package 反射; import java.lang.Class; public class test { public static void main(String[] args) throws Exception{ Class<?> date =Class.forName("java.util.Date"); System.out.println(date); } }
结果:
以上事例中可以看出除了getClass()方法会实例化对象之外,其他的俩种不会产生实例化对象,所以取得Class类对象的一个最直接的好处就是通过反射实例化对象,该方法为:
对象.newInstance()
注:newInstance()方法内部实际上调用了无参数构造方法,必须保证无参构造存在才可以。
否则会抛出java.lang.InstantiationException
异常。
范例:
package 反射; import java.lang.Class; import java.util.Date; public class test { public static void main(String[] args) throws Exception{ //通过反射机制,获取Class,通过Class来实例化对象 Class<?> cl=Class.forName("java.util.Date"); //newInstance() 这个方法会调用Date这个类的无参数构造方法,完成对象的创建。 // 重点是:newInstance()调用的是无参构造,必须保证无参构造是存在的! Object object=cl.newInstance(); System.out.println(object); } }
5.1Class类方法:
范例:1.通过反射获取普通方法并且调用方法(非常重要)
import java.lang.reflect.Method; import 新特性.泛型.泛型类方法.test; public class getMethod { public static void main(String[] args) throws Exception { //通过反射机制,获取Class,通过Class来实例化对象 Class<?> cl = test.class; //通过getMethods方法获取所有public修饰的普通方法 Method[] methods = cl.getMethods(); for (Method i : methods) { System.out.println(i); } System.out.println(); //通过getDeclaredMethods返回类中所有的实例方法 Method[] methods1 = cl.getDeclaredMethods(); for (Method i : methods1) { System.out.println(i); } } }
结果:
后续补充,未写完
可参考Java反射(超详细!)_一只小菜鸡-CSDN博客_java反射