------<a href="http://www.itheima.com" target="blank">Java培训、Android培训、iOS培训、.Net培训</a>、期待与您交流!
1.Class
.class文件加载到内存中就是一个Class对象
获取Class对象的方式有3种:
Scanner sc = newScanner("xxx.txt");
Class.forName(sc.nextLine());
类名.class
对象.getClass()
- import cn.itcast.bean.Person;
- public class Demo1_Reflect {
- /**
- * @param args
- * @throws ClassNotFoundException
- */
- public static void main(String[] args) throws ClassNotFoundException {
- Class<?> clazz1 = Class.forName("cn.itcast.bean.Person");
- Class<?> clazz2 = Person.class;
- Person p = new Person();
- Class<?> clazz3 = p.getClass();
- System.out.println(clazz1 == clazz2);
- System.out.println(clazz2 == clazz3);
- }
- }
2.Constructor
Class类的newInstance()方法是使用该类无参的构造函数创建对象, 如果一个类没有无参的构造函数, 就不能这样创建了
可以调用Class类的getConstructor(String.class,int.class)方法获取一个指定的构造函数
然后再调用Constructor类的newInstance("张三",20)方法创建对象
- import java.lang.reflect.Constructor;
- import cn.itcast.bean.Person;
- public class Demo3_Constructor {
- /*
- @throws Exception
- */
- public static void main(String[] args) throws Exception {
- Class<?> clazz = Class.forName("cn.itcast.bean.Person");
- /*Person p = (Person) clazz.newInstance();
- System.out.println(p);*/
- Constructor con = clazz.getConstructor(String.class,int.class);//获取有参的构造函数
- Person p = (Person) con.newInstance("张三",23); //创建对象
- System.out.println(p); //打印对象
- }
- }
3.Field
Class.getField(String)方法可以获取类中的指定字段(可见的), 如果是私有的可以用getDeclaedField("name")方法获取
通过set(obj, "李四")方法可以设置指定对象上该字段的值, 如果是私有的需要先调用setAccessible(true)设置访问权限
用获取的指定的字段调用get(obj)可以获取指定对象中该字段的值
- import java.lang.reflect.Constructor;
- import java.lang.reflect.Field;
- import cn.itcast.bean.Person;
- public class Demo4_Field {
- public static void main(String[] args) throws Exception {
- Class<?> clazz = Class.forName("cn.itcast.bean.Person");
- Constructor con = clazz.getConstructor(String.class,int.class);//获取有参的构造函数
- Person p = (Person) con.newInstance("张三",23); //创建对象
- /*Field f = clazz.getField("name");
- System.out.println(f);*/
- Field f = clazz.getDeclaredField("name"); //暴力反射
- f.setAccessible(true); //去除权限
- f.set(p, "李四");
- System.out.println(p);
- }
4.Method
Class.getMethod(String, Class...) 和 Class.getDeclaredMethod(String, Class...)方法可以获取类中的指定方法
调用invoke(Object,Object...)可以调用该方法
Class.getMethod("eat")invoke(obj) Class.getMethod("eat",int.class) invoke(obj,10)
- import java.lang.reflect.Constructor;
- import java.lang.reflect.Method;
- import cn.itcast.bean.Person;
- public class Demo5_Method {
- /**
- *4.Method
- Class.getMethod(String, Class...) 和 Class.getDeclaredMethod(String, Class...)方法可以获取类中的指定方法
- 调用invoke(Object, Object...)可以调用该方法
- Class.getMethod("eat") invoke(obj) Class.getMethod("eat",int.class) invoke(obj,10)
- * @throws Exception
- */
- public static void main(String[] args) throws Exception {
- Class<?> clazz = Class.forName("cn.itcast.bean.Person");
- Constructor con = clazz.getConstructor(String.class,int.class);//获取有参的构造函数
- Person p = (Person) con.newInstance("张三",23); //创建对象
- Method m = clazz.getMethod("eat");
- m.invoke(p);
- Method m2 = clazz.getMethod("eat", int.class);
- m2.invoke(p, 10);
- }
- }