文章图片
文章图片
文章图片
文章图片
文章图片
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.调用有参数构造器得到一个类的对象返回
}
文章图片
文章图片
文章图片
文章图片
文章图片
文章图片
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对象】
文章图片
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);
}
}
文章图片
文章图片
文章图片
文章图片
文章图片
文章图片
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);
}
}
文章图片
推荐阅读
- JavaSE|Java的反射技术(Class类,Constructor类,Method类, Field类)
- Java学习|Java>获取Class对象的三种方式,及其Method、Field、Constructor对象的使用方法
- java|学习Java期末总结
- 基础Java练习15(打印水仙花数)
- 基础Java练习19(测试从出生到现在活了多久)
- java|基础Java练习20(词频统计)
- 时区|springboot new Date() 时区差8小时
- 用Java十多年了,能“精通Java”了吗()
- JavaWeb|JSP-02动态网页技术基础