1.每个类被加载后,系统都会为该类生成一个对应的Class对象,通过该Class对象就可以访问到JVM中的这个类
2.Java程序中获得Class对象通常有如下三种方式:
1)使用Class的forName()
2)调用某个类的class属性
3)调用某个对象的getClass()
3.一旦获取了某个类的Class对象之后,程序就可以调用Class对象的方法来获得该对象和该类的真实信息了
4.加载过程:
Cat.java---->编译---->Cat.class---->加载至JVM(classload())---->Class对象---->以Class对象为模板进行创建对象
5.获取Class对象
public class ReflectionDemo{ public static void main(String [] args) throws Exception{ //得到Class对象 Class clazz=Class.forName("Cat"); Class clazz2=Cat.class; Class clazz3=new Cat().getClass(); //clazz,clazz2,clazz3都指向同一个对象 if(clazz==clazz2 && clazz2==clazz3){ System.out.println("same"); } } } class Cat{ private String name; public void show(){ System.out.println("cat cry"); } }
6.利用反射创建对象
使用默认构造函数实例化对象
public static void main(String [] args) throws Exception{
//得到Class对象
Class clazz=Class.forName("Cat");
Cat cat=(Cat) clazz.newInstance();
cat.show();
}
使用带参数的构造函数实例化对象,普通类型参数
import java.lang.reflect.Constructor; public class ReflectionDemo{ public static void main(String [] args) throws Exception{ //得到Class对象 Class clazz=Class.forName("Cat"); Constructor c=clazz.getConstructor(String.class,int.class); Cat cat=(Cat) c.newInstance("lvjy",28); System.out.println(cat.getName()); cat.show(); } }
传递数组类型的参数
import java.lang.reflect.Constructor; public class ReflectionDemo{ public static void main(String [] args) throws Exception{ //得到public Cat(String [] food)构造函数 Class clazz=Class.forName("Cat"); Constructor c=clazz.getConstructor(String[].class); Cat cat=(Cat) c.newInstance((Object) new String[]{"fish","mouse"}); for(String f:cat.getFood()){ System.out.println(f); } } }
import java.lang.reflect.Constructor; public class ReflectionDemo{ public static void main(String [] args) throws Exception{ //得到public Cat(String [] food)构造函数 Class clazz=Class.forName("Cat"); Constructor c=clazz.getConstructor(String[].class); Cat cat=(Cat) c.newInstance(new Object[]{new String[]{"fish","mouse"}}); for(String f:cat.getFood()){ System.out.println(f); } } }
7.利用反射调用函数
调用无参函数 import java.lang.reflect.Constructor; import java.lang.reflect.Method; public class ReflectionDemo{ public static void main(String [] args) throws Exception{ //得到public Cat(String [] food)构造函数 Class clazz=Class.forName("Cat"); Method m=clazz.getMethod("show"); m.invoke(clazz.newInstance()); } }
调用有参函数
import java.lang.reflect.Constructor; import java.lang.reflect.Method; public class ReflectionDemo{ public static void main(String [] args) throws Exception{ //得到public Cat(String [] food)构造函数 Class clazz=Class.forName("Cat"); Method m=clazz.getMethod("show",String.class); m.invoke(clazz.newInstance(),"lvjy"); } }
调用私有函数
import java.lang.reflect.Constructor; import java.lang.reflect.Method; public class ReflectionDemo{ public static void main(String [] args) throws Exception{ Class clazz=Class.forName("Cat"); Method m=clazz.getDeclaredMethod("greeting"); m.setAccessible(true);//暴力访问 m.invoke(clazz.newInstance()); } }
8.利用反射访问成员变量
访问公有变量
import java.lang.reflect.Constructor; import java.lang.reflect.Method; import java.lang.reflect.Field; public class ReflectionDemo{ public static void main(String [] args) throws Exception{ Class clazz=Class.forName("Cat"); Field f=clazz.getField("name"); //取得f的值 String name=(String)f.get(clazz.newInstance()); System.out.println(name); } }
访问私有变量 import java.lang.reflect.Constructor; import java.lang.reflect.Method; import java.lang.reflect.Field; public class ReflectionDemo{ public static void main(String [] args) throws Exception{ Class clazz=Class.forName("Cat"); Field f=clazz.getDeclaredField("age"); f.setAccessible(true); Cat cat=(Cat) clazz.newInstance(); f.set(cat,30); System.out.println(f.get(cat)); } }