每日更新|黑马JAVA P189 反射获取Constructor、Field、Method对象

每日更新|黑马JAVA P189 反射获取Constructor、Field、Method对象
文章图片
每日更新|黑马JAVA P189 反射获取Constructor、Field、Method对象
文章图片
每日更新|黑马JAVA P189 反射获取Constructor、Field、Method对象
文章图片

每日更新|黑马JAVA P189 反射获取Constructor、Field、Method对象
文章图片

每日更新|黑马JAVA P189 反射获取Constructor、Field、Method对象
文章图片


package com.itheima.d3_reflect_constructor; public class Student { private String name; private int age; private Student() { System.out.println("无参数构造器执行!"); }public Student(String name, int age) { System.out.println("有参数构造器执行!"); this.name = name; this.age = age; }public String getName() { return name; }public void setName(String name) { this.name = name; }public int getAge() { return age; }public void setAge(int age) { this.age = age; }@Override public String toString() { return "Student{" + "name='" + name + '\'' + ", age=" + age + '}'; } }

package com.itheima.d3_reflect_constructor; import org.junit.Test; import java.lang.reflect.Constructor; public class TestStudent02 { //1.调用无参数构造器得到一个类的对象返回 @Test public void getDeclaredConstructor() throws Exception{ //a.第一步:获取类对象 Class c = Student.class; //b.定位单个构造器对象(按照参数定位无参数构造器 Constructor cons = c.getDeclaredConstructor(); System.out.println(cons.getName() + "====>" + cons.getParameterCount()); //如果遇到了私有的构造器,可以暴力反射 cons.setAccessible(true); //权限被打开Student s = (Student) cons.newInstance(); System.out.println(s); System.out.println("-------"); //c.定位某个有参构造器 Constructor cons1 = c.getDeclaredConstructor(String.class, int.class); System.out.println(cons1.getName() + "====>" + cons1.getParameterCount()); Student s1 = (Student) cons1.newInstance("孙悟空",1000); System.out.println(s1); }//2.调用有参数构造器得到一个类的对象返回 }

每日更新|黑马JAVA P189 反射获取Constructor、Field、Method对象
文章图片


每日更新|黑马JAVA P189 反射获取Constructor、Field、Method对象
文章图片

每日更新|黑马JAVA P189 反射获取Constructor、Field、Method对象
文章图片

每日更新|黑马JAVA P189 反射获取Constructor、Field、Method对象
文章图片

每日更新|黑马JAVA P189 反射获取Constructor、Field、Method对象
文章图片

每日更新|黑马JAVA P189 反射获取Constructor、Field、Method对象
文章图片


package com.itheima.d4_reflect_field; public class Student { private String name; private int age; public static String schoolName; public static final String COUNTTRY = "中国"; Student() { System.out.println("无参数构造器执行!"); }public Student(String name, int age) { System.out.println("有参数构造器执行!"); this.name = name; this.age = age; }public String getName() { return name; }public void setName(String name) { this.name = name; }public int getAge() { return age; }public void setAge(int age) { this.age = age; }@Override public String toString() { return "Student{" + "name='" + name + '\'' + ", age=" + age + '}'; } }

package com.itheima.d4_reflect_field; import org.junit.Test; import java.lang.reflect.Field; /** * 目标:反射_获取Field成员变量对象。 * 反射的第一步是先得到Class类对象。 * * 1.Field getField(String name); *根据成员变量名获取对应Field对象,只能获得public修饰 * 2.Field getDeclaredField(string name); *根据成员变量名获得对应Field对象,只要申明了就可以得到 * 3.Field[] getFields(); *获取所有的成员变量对应的Field对象,只能获得public的 * 4.Field[] getDeclaredFields(); *获得所有的成员变量对应的Field对象,只要申明了就可以得到 * * 小结: *获取全部成员变量:getDeclaredFields *获取某个成员变量:getDeclaredField */public class FieldDemo01 { /** * 1.获取全部的成员变量。 * Field[] getDeclaredFields(); * 获取所有的成员变量对应的Field对象,只要申明了就可以得到 */@Test public void getDeclaredFields() { //a.定位Class对象 Class c = Student.class; //b.定位全部成员变量 Field[] fields = c.getDeclaredFields(); //c.遍历一下 for (Field field : fields) { System.out.println(field.getName() + "===>" + field.getType()); } }/** * 2.获取某个成员变量对象 Field getDeclaredField(String name); */ @Test public void getDeclaredField() throws Exception { //a.定位Class对象 Class c = Student.class; //b.根据名称定位某个 成员变量 Field f = c.getDeclaredField("age"); System.out.println(f.getName() + "===>" + f.getType()); } }

【每日更新|黑马JAVA P189 反射获取Constructor、Field、Method对象】每日更新|黑马JAVA P189 反射获取Constructor、Field、Method对象
文章图片


package com.itheima.d4_reflect_field; import org.junit.Test; import java.lang.reflect.Field; /** * 目标:反射获取成员变量:取值和赋值 * * Field的方法:给成员变量赋值和取值 *void set(Object obj,Object value):给对象注入某个成员变量 数据 *Object get(Objcet obj):获取对象的成员变量的值。 *void setAccessible(true):暴力反射,设置为可以直接访问私有类型的属性。 *Class getType(); 获取属性的类型,返回Class对象。 *String getName(); 获取属性的名称。 */ public class FieldDemo02 { @Test public void setField() throws Exception{ //a.反射第一步,获取类对象 Class c = Student.class; //b.提取某个成员变量 Field ageF = c.getDeclaredField("age"); ageF.setAccessible(true); // 暴力打开权限//c.赋值 Student s = new Student(); ageF.set(s , 18); // s.setAge(18); System.out.println(s); //d.取值 int age = (int) ageF.get(s); System.out.println(age); } }

每日更新|黑马JAVA P189 反射获取Constructor、Field、Method对象
文章图片


每日更新|黑马JAVA P189 反射获取Constructor、Field、Method对象
文章图片
每日更新|黑马JAVA P189 反射获取Constructor、Field、Method对象
文章图片
每日更新|黑马JAVA P189 反射获取Constructor、Field、Method对象
文章图片

每日更新|黑马JAVA P189 反射获取Constructor、Field、Method对象
文章图片

每日更新|黑马JAVA P189 反射获取Constructor、Field、Method对象
文章图片


package com.itheima.d5_reflect_method; public class Dog { private String name; public Dog(){}public Dog(String name) { this.name = name; }public void run(){ System.out.println("狗跑的贼快~~"); }privatevoid eat(){ System.out.println("狗吃骨头"); }private String eat(String name){ System.out.println("狗吃"+ name); return "吃的很开心!"; }public staticvoid inAddr(){ System.out.println("在黑马学习Java!"); }public String getName() { return name; }public void setName(String name) { this.name = name; } }

package com.itheima.d5_reflect_method; import org.junit.Test; import java.lang.reflect.Method; /** * 反射获取类的Method方法对象: *1.Method getMethod(String name, Class...args); *根据方法名和参数类型获得对应的方法对象,只能获得public的 *2.Method getDeclaredMethod(String name, Class...args); *根据方法名和参数类型获得对应的方法对象,包括private的 *3.Method[] getMethods(); *获得类中的所有成员方法对象,返回数组,只能获得public修饰的且包含父类的 *4.Method[] getDeclaredMethods(); *获取类中的所有成员方法对象,返回数组,只获得本类申明的方法。 * * Method 的方法执行: *Object invoke(Object obj, Object...args) *参数一:触发的是哪个对象的方法执行。 *参数二:args:调用方法时传递的实际参数 */ public class MethodDemo01 { /** * 1.获得类中的所有成员方法对象 */ @Test public void getDeclaredMethods(){ ////a.获取类对象 //Class c = Dog.class; ////b.提取全部方法:包括私有的 //Method[] methods = c.getDeclaredMethods(); ////c.遍历全部方法 //for (Method method : methods) { //System.out.println(method.getName() + "返回值类型" + method.getReturnType() + "参数个数" + method.getParameterCount()); //}}/** * 2.获取某个方法对象 */ @Test public void getDeclardMethod() throws Exception{ //a.获取类对象 Class c = Dog.class; //b.提取单个方法对象 Method m = c.getDeclaredMethod("eat"); Method m2 = c.getDeclaredMethod("eat",String.class); //暴力打开权限了 m.setAccessible(true); m2.setAccessible(true); //c.触发方法的执行 Dog d = new Dog(); //注意:方法如果是没有结果回来的,那么返回的是null. Object result = m.invoke(d); System.out.println(result); Object result2 = m2.invoke(d,"骨头"); System.out.println(result2); } }

每日更新|黑马JAVA P189 反射获取Constructor、Field、Method对象
文章图片


    推荐阅读