韩顺平老师Java反射专题-教你快速入门

总结不易,记得关注 !!!

re.properties:配置文件:

classfullpath=com.hspedu.Cat
method=cry

Cat类:

package com.hspedu;

public class Cat {
    private String name="招财猫";
    public  int age=10;

    public Cat() {//无参构造器
    }

    public Cat(String name) {
        this.name = name;
    }

    public void hi(){
        //System.out.println("hi  "+name);
    }
    public void cry(){
        System.out.println(name+" 喵喵叫..");
    }
}

ReflectionQuestion类:
package com.hspedu.reflection.question;

import com.hspedu.Cat;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.Properties;

public class ReflectionQuestion {
    public static void main(String[] args) throws IOException, ClassNotFoundException, IllegalAccessException, InstantiationException, NoSuchMethodException, InvocationTargetException {
        //根据配置文件,re.properties指定信息,创建Cat对象并调用方法hi

        //传统方式
//        Cat cat=new Cat();
//        cat.hi();

        //1.使用Properties类,可以读取配置文件
        Properties properties=new Properties();
        properties.load(new FileInputStream("src\\re.properties"));
        String classfullpath = properties.get("classfullpath").toString();//类的全路径“com.hspedu.Cat”
        String methodName = (String) properties.get("method");//方法“hi” 配置文件已改为cry
        System.out.println("classfullpath="+classfullpath);//classfullpath=com.hspedu.Cat
        System.out.println("method="+methodName);//method=cry

        //2.创建对象
        Cat cat2=new com.hspedu.Cat();
        cat2.hi();
        //Cat  cat2=new classfullpath();  错误的   new classfullpath是String 不是类名

        //3.使用反射机制解决
        //(1)加载类 返回Class类型的对象cls
        Class cls = Class.forName(classfullpath); //Class类
        System.out.println(cls);
        //(2)通过cls 得到加载类的com.hspedu.Cat 的对象实例
        Object o=cls.newInstance();//class com.hspedu.Cat
        System.out.println(o);//com.hspedu.Cat@1540e19d
        System.out.println("o运行类型="+o.getClass());//运行类型
        //(3)通过cls得到加载的类com.hspedu.Cat的methodName(“hi”) 的方法对象 即在反射中可以把方法视为对象(万物皆对象)
        Method method1 = cls.getMethod(methodName);
        System.out.println("==============");
        //(4)通过method1调用方法:即通过方法对象实现调用方法
        method1.invoke(o);//传统方法 对象.方法() ,反射机制 方法.invoke(对象)




    }
}

 

 

Java反射机制原理图: 

 

 

 

 

 

 

Reflection01类:
package com.hspedu.reflection;

import java.io.FileInputStream;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.Properties;

public class Reflection01 {
    public static void main(String[] args)throws Exception {
        //1.使用Properties类,可以读取配置文件
        Properties properties=new Properties();
        properties.load(new FileInputStream("src\\re.properties"));
        String classfullpath = properties.get("classfullpath").toString();//类的全路径“com.hspedu.Cat”
        String methodName = (String) properties.get("method");//方法“hi”

        //3.使用反射机制解决
        //(1)加载类 返回Class类型的对象cls
        Class cls = Class.forName(classfullpath); //Class类
        //(2)通过cls 得到加载类的com.hspedu.Cat 的对象实例
        Object o=cls.newInstance();
        System.out.println(o);
        System.out.println("o运行类型="+o.getClass());//运行类型
        //(3)通过cls得到加载的类com.hspedu.Cat的methodName(“hi”) 的方法对象 即在反射中可以把方法视为对象(万物皆对象)
        Method method1 = cls.getMethod(methodName);
        System.out.println("==============");
        //(4)通过method1调用方法:即通过方法对象实现调用方法
        method1.invoke(o);//传统方法 对象.方法() ,反射机制 方法.invoke(对象)

        //得到类成员变量
        // java.lang.reflection.Fiels:代表类的成员变量,Filed对象代表某个类的成员变量
        //得到name字段  getField不能得到私有的属性
        //Field name = cls.getField("name");
        Field ageField= cls.getField("age");//获得共有的age字段
        System.out.println(ageField.get(o));//传统写法 对象.成员变量,反射:成员变量对象.get(对象)

        //得到构造器
        //java.lang.reflect.Constructor:代表类的构造方法,Constructor对象表示构造器
        Constructor constructor=cls.getConstructor();//()中可以指定构造器的参数类型,没有写返回的是无参构造器
        System.out.println(constructor);

        Constructor constructor2 = cls.getConstructor(String.class);//String.class就是String类的Class对象
        System.out.println(constructor2);
        //得到构造器又可以帮我们构造对象

    }
}

 

 反射优化:

 

package com.hspedu.reflection;

import com.hspedu.Cat;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

/*
测试反射调用的性能和优化方案
 */
public class Reflection02 {
    public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException, InstantiationException, IllegalAccessException {
        m1();
        m2();
        m3();
    }
    //传统方法调用hi
    public static void m1(){
        Cat cat=new Cat();
        long start = System.currentTimeMillis();
        for (int i = 0; i <90000000 ; i++) {
            cat.hi();
        }
        long end = System.currentTimeMillis();
        System.out.println("m1方法耗时="+(end-start));

    }
    //通过反射机制调用方法hi
    public static void m2() throws ClassNotFoundException, IllegalAccessException, InstantiationException, NoSuchMethodException, InvocationTargetException {
        //获取Class对象
        Class cls = Class.forName("com.hspedu.Cat");
        //通过cls对象new了一个实例
        Object o=cls.newInstance();
        //通过cls的到方法对象
        Method hi = cls.getMethod("hi");

        long start = System.currentTimeMillis();
        for (int i = 0; i <90000000 ; i++) {
            hi.invoke(o);//反射机制调用方法 通过Method调用o
        }
        long end = System.currentTimeMillis();
        System.out.println("m2方法耗时="+(end-start));
    }
    //反射的优化:关闭访问检查
    //通过反射机制调用方法hi
    public static void m3() throws ClassNotFoundException, IllegalAccessException, InstantiationException, NoSuchMethodException, InvocationTargetException {
        //获取Class对象
        Class cls = Class.forName("com.hspedu.Cat");
        //通过cls对象new了一个实例
        Object o=cls.newInstance();
        //通过cls的到方法对象
        Method hi = cls.getMethod("hi");

        hi.setAccessible(true);//在反射调用方法时,取消访问机制,提高效率

        long start = System.currentTimeMillis();
        for (int i = 0; i <90000000 ; i++) {
            hi.invoke(o);//反射机制调用方法 通过Method调用o
        }
        long end = System.currentTimeMillis();
        System.out.println("m3方法耗时="+(end-start));
    }
}

 

 

 

1.

 

2. 

package com.hspedu.reflection.Class;

import com.hspedu.Cat;

/*
对Class类的梳理
 */
public class Class01 {
    public static void main(String[] args) throws ClassNotFoundException {
        //2.Class类不是new出来的,而是系统创建的
        //(1)传统new对象
        /*
        public Class<?> loadClass(String name) throws ClassNotFoundException {
        return loadClass(name, false);
    }
         */
        //Cat cat=new Cat();
        //(2)反射方式
        /*
        ClassLoader类,仍然是通过ClassLoader加载Cat类的Class对象
         public Class<?> loadClass(String name) throws ClassNotFoundException {
        return loadClass(name, false);
    }
         */
        Class cls1=Class.forName("com.hspedu.Cat");

        //3.对于某个类的Class对象,在内存只有一份,因为类只加载一次
        Class cls2 = Class.forName("com.hspedu.Cat");
        System.out.println(cls1.hashCode());//356573597
        System.out.println(cls2.hashCode());//356573597,对应同一个对象相同说明是一个对象
        Class cls3 = Class.forName("com.hspedu.Dog");
        System.out.println(cls3.hashCode());//1735600054 Dog对应的一个Class对象

        //

    }
}

 Dog类:

package com.hspedu;

public class Dog {
}

 

 4.

 

 

 

 

 

 Car类:

package com.hspedu;

public class Car {
    public String brand="宝马";
    public int price=500000;
    public String color="白色";

    @Override
    public String toString() {
        return "Car{" +
                "brand='" + brand + '\'' +
                ", price=" + price +
                ", color='" + color + '\'' +
                '}';
    }
}

Class02类:

package com.hspedu.reflection.Class;

import com.hspedu.Car;
import com.hspedu.Cat;

import java.lang.reflect.Field;
/*
类的常用方法
 */
public class Class02 {
    public static void main(String[] args) throws ClassNotFoundException, IllegalAccessException, InstantiationException, NoSuchFieldException {
        String classAllPath="com.hspedu.Car";
        //获取Car类 对应的Class对象
        //<?>表示不确定的Java类型
        Class<?> cls=Class.forName(classAllPath);
        //输出cls
        System.out.println(cls);//class com.hspedu.Car显示cls对象,是哪个Class对象 com.hspedu.Car
        System.out.println(cls.getClass());//class java.lang.Class,输出cls运行类型 java.lang.Class

        //得到包名
        System.out.println(cls.getPackage().getName());//com.hspedu
        //得到类名
        System.out.println(cls.getName());//com.hspedu.Car

        //通过cls创建对象实例
        Car car=(Car) cls.newInstance();
        System.out.println(car);//调用car.toString()  com.hspedu.Car@1540e19d  Car{brand='宝马', price=500000, color='白色'}

        //通过反射获取属性brand
        Field brand = cls.getField("brand");
        System.out.println(brand.get(car));//宝马

        //给属性赋值
        brand.set(car,"奔驰");
        System.out.println(brand.get(car));//奔驰
        //8我希望获取所有的属性
        Field[] fileds=cls.getFields();
        for (Field f:fileds){
            System.out.println(f.getName());//名称
        }
    }
}

 

 

 

 

 getClass类:

package com.hspedu.reflection.Class;

import com.hspedu.Car;

/*
得到Class的各种方式
 */
public class getClass {
    public static void main(String[] args) throws ClassNotFoundException {
        //1.Class.forName
        String classAllPath="com.hspedu.Car";//全路径
        Class<?> cls=Class.forName(classAllPath);
        //输出cls
        System.out.println(cls);//class com.hspedu.Car

        //2.类名.Class 应用场景:用于参数传递
        Class cls2= Car.class;
        System.out.println(cls2);

        //3.对象.getClass() 应用场景,有对象实例
        Car car=new Car();
        Class cls3=car.getClass();
        System.out.println(cls3);

        //4.通过类加载器【4】种,得到类的Class对象
        //(1)先得到类加载器
        ClassLoader classLoader=car.getClass().getClassLoader();
        //(2)通过类的加载器获得Class对象
        Class cls4=classLoader.loadClass(classAllPath);
        System.out.println(cls4);

        //cls1,cls2,cls3,cls4是同一个对象

        //基本数据类型型(int char boolean,double,byte,short,long,short)按如下方式得到Class对象
        Class<Integer> integerClass=int.class;
        Class<Character> characterClass = char.class;
        Class<Boolean> booleanClass = boolean.class;
        System.out.println(integerClass);//int

        //基本类型对应的包装类,可以通过 .TYPE 得到Class对象
        Class<Integer> type = Integer.TYPE;
        Class<Character> type1 = Character.TYPE;
        System.out.println(type1);//char

        System.out.println(integerClass.hashCode());//356573597
        System.out.println(type.hashCode());//356573597
    }
}

 

 那些类型有Class对象?

 

AllTypeClass类:

package com.hspedu.reflection.Class;

import java.io.Serializable;

/*
那些类型有Class对象
 */
public class AllTyprClass {
    public static void main(String[] args) {
        Class<String> cls1 = String.class;//外部类
        Class<Serializable> cls2 = Serializable.class;//接口
        Class<Integer[]> cls3 = Integer[].class;//数组
        Class<float[][]> cls4 = float[][].class;//二维数组
        Class<Deprecated> cls5 = Deprecated.class;//注解
        Class<Thread.State> cls6 = Thread.State.class;//枚举
        Class<Long> cls7 = long.class;//基本数据类型
        Class<Void> cls8 = void.class;//void
        Class<Class> cls9 = Class.class;

        System.out.println(cls1);
        System.out.println(cls2);
        System.out.println(cls3);
        System.out.println(cls4);
        System.out.println(cls5);
        System.out.println(cls6);
        System.out.println(cls7);
        System.out.println(cls8);
        System.out.println(cls9);


    }
}

 

 

 

因为静态加载:注释Dog 

 

 编译通过

 

 

 

 

 

 

 

验证:文件的安全进行验证:文件描述符、源数据、字节码文件的安全性进行验证

准备:对静态变量进行默认初始化 ,并分配空间

解析:将符号引用转成直接引用

 

 

 

 20会在加载的初始化阶段变为20

 

 

 

 

 

 

 New 对象造成类加载

 

 

 

 获取类的结构信息

 

 

 

 

 

 ReflectionUtils.java

package com.hspedu.reflection;

import org.junit.Test;

import java.lang.annotation.Annotation;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;

/*
通过反射获取类的结构信息
 */
public class ReflectionUtils {
    public static void main(String[] args) {

    }
    //第二组API
    @Test
    public void api_02() throws ClassNotFoundException {
        //1.得到类的Class对象
        Class<?> personCls = Class.forName("com.hspedu.reflection.Person");
        //2.getName:获取全类名
        System.out.println(personCls.getName());//com.hspedu.reflection.Person

        //declaredField.getModifiers():获取该属性的修饰符值  规定默认修饰符 是0,public 是1,protected是4,static是8,final16
        //declaredField.getType():这个属性类型对应的那个类的Class对象
        //.getDeclaredFields:获取本类中所有的属性
        Field[] declaredFields = personCls.getDeclaredFields();
        for(Field declaredField:declaredFields){
            System.out.println("本类中所有的属性:"+declaredField.getName()
                    +" 该属性的修饰符值="+declaredField.getModifiers()
                    +" 该属性的类型="+declaredField.getType());
        }

        //7.getDeclaredMethods:获取本类中的所有的方法
        Method[] declaredMethods = personCls.getDeclaredMethods();
        for (Method declaredMethod:declaredMethods){
            System.out.println("本类中所有的方法="+declaredMethod.getName());
        }

        //declaredMethod.getModifiers():以int形式返回修饰符
        //declaredMethod.getReturnType():以Class形式获取,返回类型
        Method[] declaredMethods1 = personCls.getDeclaredMethods();
        for (Method declaredMethod : declaredMethods) {
            System.out.println("本类中所有的方法="+declaredMethod.getName()
            +" 该方法的访问修饰符值="+declaredMethod.getModifiers()
            +" 该方法返回类型"+declaredMethod.getReturnType());

            //输出当前方法的参数数组情况
            Class<?>[] parameterTypes = declaredMethod.getParameterTypes();
            for (Class<?> parameterType : parameterTypes) {
                System.out.println("该方法的形参类型="+parameterType);
            }

        }

        //9.getDeclaredConstructors:获取本类中所有的构造器
        Constructor<?>[] declaredConstructors = personCls.getDeclaredConstructors();
        for (Constructor<?> declaredConstructor : declaredConstructors) {
            System.out.println("本类中所有的构造器="+declaredConstructor.getName());
            Class<?>[] parameterTypes = declaredConstructor.getParameterTypes();
            for (Class<?> parameterType : parameterTypes) {
                System.out.println("改构造器的形参类型="+parameterType);
            }
        }

    }



    //第一组方法API
    @Test
    public void api_01() throws ClassNotFoundException {
        //1.得到类的Class对象
        Class<?> personCls = Class.forName("com.hspedu.reflection.Person");
        //2.getName:获取全类名
        System.out.println(personCls.getName());//com.hspedu.reflection.Person
        //3.getSimpleName:获取简单的类名
        System.out.println(personCls.getSimpleName());//Person
        //4.getFields:获取所有public修饰的属性,包含本类以及父类的
        Field[] fields = personCls.getFields();
        for (Field field:fields){
            System.out.println("本类以及父类的public属性"+field.getName());
        }
        //5.getDeclaredFields:获取本类中所有的属性
        Field[] declaredFields = personCls.getDeclaredFields();
        for(Field declaredField:declaredFields){
            System.out.println("本类中所有的属性:"+declaredField.getName());
        }
        //6.getMethods:获取所有的public修饰的方法,包括本类以及父类
        Method[] methods = personCls.getMethods();
        for (Method method:methods){
            System.out.println("本类以及父类的public方法:"+method.getName());
        }
        //7.getDeclaredMethods:获取本类中的所有的方法
        Method[] declaredMethods = personCls.getDeclaredMethods();
        for (Method declaredMethod:declaredMethods){
            System.out.println("本类中所有的方法="+declaredMethod.getName());
        }
        //8.getConstructors:获取所有public修饰的构造器,包含本类
        Constructor<?>[] constructors = personCls.getConstructors();
        for (Constructor<?> constructor :constructors){
            System.out.println("本类的构造器:"+constructor.getName());
        }
        //9.getDeclaredConstructors:获取本类中所有的构造器
        Constructor<?>[] declaredConstructors = personCls.getDeclaredConstructors();
        for (Constructor<?> declaredConstructor : declaredConstructors) {
            System.out.println("本类中所有的构造器="+declaredConstructor.getName());
        }
        //10.getPackage:以Package形式返回包的信息
        System.out.println(personCls.getPackage());//package com.hspedu.reflection
        //11.getSupperClass:以Class形式返回父类信息
        Class<?> superclass = personCls.getSuperclass();
        System.out.println("父类的Class对象:"+superclass);//父类的Class:class com.hspedu.reflection.A
        //12.getInterfaces:以及Class[] 形式返回接口的信息
        Class<?>[] interfaces = personCls.getInterfaces();
        for (Class<?> anInterface : interfaces) {
            System.out.println("接口信息="+anInterface);
        }
        //13.getAnnotations:以Annotation[] 形式返回注解信息
        Annotation[] annotations = personCls.getAnnotations();
        for (Annotation annotation : annotations) {
            System.out.println("注解信息="+annotation);
        }


    }
}

class A{
    public String hobby;
    public void hi(){

    }

    public A() {
    }
}

interface IA{

}
interface IB{

}

@Deprecated //注解

class Person extends A implements IA,IB{
    public String name;
    protected static int age;  //4+8=12
    String job;
    private double sal;

    //构造器
    public Person() {
    }

    public Person(String name) {

    }

    private Person(String name, int age) {

    }

    private void m1(String neme,int age,double sal){

    }
    protected String m2(){
        return null;
    }
    void m3(){

    }
    private void m4(){

    }
}

第一组API结果:

第二组API结果:

 

 

 

 

ReflecCreateInstance类:
package com.hspedu.reflection;

import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;

/*
反射机制创建实例
 */
public class ReflecCreateInstance {
    public static void main(String[] args) throws ClassNotFoundException, IllegalAccessException, InstantiationException, NoSuchMethodException, InvocationTargetException {
        //1.先获取到User类的Class对象
        Class<?> userClass = Class.forName("com.hspedu.reflection.User");
        //2.通过public的无参构造器创建实例
        Object o = userClass.newInstance();
        System.out.println(o);
        //3.通过public的有参构造器创建实例
        /*
        带有形参的构造器,不能直接通过new Class兑对象来new Instace
        必须:
        1.得到对应的构造器
        2.再去创建实例
          constructor 对象就是
            public User(String name) {
                 this.name = name;
            }
         */
        Constructor<?> constructor = userClass.getConstructor(String.class);//需要传入形参的对象
        Object hsp = constructor.newInstance("hsp");
        System.out.println("hsp="+hsp);
        //4.通过private的有参构造器常见实例
        Constructor<?> constructor1 = userClass.getDeclaredConstructor(int.class, String.class);
        constructor1.setAccessible(true);//需要进行爆破【暴力破解】,使用反射可以访问private构造器/属性/方法
        Object user2 = constructor1.newInstance(100, "张三丰");//constructor1对象是私有的,直接创建对象会报错,需要先进行爆破
        System.out.println(user2);
    }
}
class User {
    private int age=20;
    private String name="香茗";

    public User() {
    }

    public User(String name) {
        this.name = name;
    }

    private User(int age, String name) {
        this.age = age;
        this.name = name;
    }

    @Override
    public String toString() {
        return "User{" +
                "age=" + age +
                ", name='" + name + '\'' +
                '}';
    }
}

 

 

 

 

 

ReflecAccessProperty类:
package com.hspedu.reflection;

import java.lang.reflect.Field;

/*
反射操作属性
 */
public class ReflecAccessProperty {
    public static void main(String[] args) throws ClassNotFoundException, IllegalAccessException, InstantiationException, NoSuchFieldException {
        //得到Student类对应的Class对象
        Class<?> stuaClass = Class.forName("com.hspedu.reflection.Student");
        //创建对象
        Object o = stuaClass.newInstance();
        System.out.println(o.getClass());//运行类型Student
        //3.通过反射得到age属性对象
        Field age = stuaClass.getField("age");
        age.set(o,88);//通过反射操作类的属性
        System.out.println(o);//Student{age=88,namenull}
        System.out.println(age.get(o));//返回age属性的值

        //4.使用反射操作name属性
        Field name = stuaClass.getDeclaredField("name");
        name.setAccessible(true);//name是私有的,不能直接访问,必须进行爆破
        name.set(o,"懒汉");
        System.out.println(o);//Student{age=88,name懒汉}

        name.set(null,"老汉");//因为name是static属性,因此o也可以写出null
        System.out.println(o);//Student{age=88,name老汉}
        System.out.println(name.get(o));
        System.out.println(name.get(null));//只有是静态的属性才能写null
    }
}
class Student{
    public int age;
    private static String name;
    public Student(){

    }

    @Override
    public String toString() {
        return "Student{" +
                "age=" + age +","+
                "name"+name+
                '}';
    }
}

 

 

 

 

ReflecAccessMethod 类:
package com.hspedu.reflection;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

/*
反射调用方法
 */
public class ReflecAccessMethod {
    public static void main(String[] args) throws ClassNotFoundException, IllegalAccessException, InstantiationException, NoSuchMethodException, InvocationTargetException {
        //1.得到Boss类对应的Class对象
        Class<?> bossClass = Class.forName("com.hspedu.reflection.Boss");
        //2.创建对象
        Object o = bossClass.newInstance();
        //3.调用public的hi方法对象
        Method hi1 = bossClass.getMethod("hi", String.class);//获取共有的
        hi1.invoke(o,"nihao");

        Method hi = bossClass.getDeclaredMethod("hi",String.class);//可以获取所有
        //调用
        hi.invoke(o,"韩淑萍");

        //4.调用私有的方法 say对象
        Method say = bossClass.getDeclaredMethod("say", int.class, String.class, char.class);
        say.setAccessible(true);
        System.out.println(say.invoke(o,100,"张三",'男'));//say方法是私有的,需要爆破
        //say方法是static的,还可以这样调用
        System.out.println(say.invoke(null,200,"lisi",'女'));

        //5.在反射中,如果方法有返回值,统一返回Object  但是它运行类型和方法定义的返回类型一致
        Object reVal = say.invoke(null, 300, "王五", '男');
        System.out.println(reVal);
        System.out.println("raVal的运行类型="+reVal.getClass());//raVal的运行类型=class java.lang.String
    }
}
class Boss{
    public int age;
    private static String name;

    public Boss() {
    }
    private static String say(int n,String s,char c){
        return n+" "+s+" "+ c;
    }
    public void hi(String s){
        System.out.println("hi "+s);
    }
}

 

 

Hmoeword01类:
package com.hspedu.reflection.homework;

import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

public class Hmoeword01 {
    public static void main(String[] args) throws IllegalAccessException, InstantiationException, NoSuchFieldException, NoSuchMethodException, InvocationTargetException {
        /*
        提供getName的共有方法,利用Class类的私有属性的name属性,修改私有的name属性值,并调用getName()方法打印name
         */
        //1.得到PrivateTest类对应的Class对象
        Class<PrivateTest> privateTestClass = PrivateTest.class;
        //创建对象实例
        PrivateTest privateTestObj = privateTestClass.newInstance();
        //得到name属性对象,name属性是私有的,所以用getDeclaredField
        Field name=privateTestClass.getDeclaredField("name");
        //4.爆破
        name.setAccessible(true);
        name.set(privateTestObj,"天龙八部");
        //5.得到getName方法对象
        Method getName = privateTestClass.getMethod("getName");
        //6.因为getName是public,所以不用爆破
        Object invoke = getName.invoke(privateTestObj);
        System.out.println("name属性值="+invoke);
    }
}
class PrivateTest{
    private String name="hellokitty";
    //有一个默认无参构造器
    public String getName(){
        return name;
    }
}

 

 

Homework02类:
package com.hspedu.reflection.homework;

import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

public class Homework02 {
    public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException {
        //Class类的forName方法得到File类的Class对象
        Class<?> fileClass = Class.forName("java.io.File");
        //2.得到所有的构造器
        Constructor<?>[] declaredConstructors = fileClass.getDeclaredConstructors();
        //遍历输出
        for (Constructor<?> declaredConstructor : declaredConstructors) {
            System.out.println("File的构造器"+declaredConstructor);
        }
        //3.指定得到  File的构造器public java.io.File(java.lang.String)
        Constructor<?> declaredConstructor = fileClass.getDeclaredConstructor(String.class);
        String fileAllPath="E:\\mynew .txt";
        Object file = declaredConstructor.newInstance(fileAllPath);//创建File对象
        //4.得到createNewFile对象
        Method createNewFile = fileClass.getMethod("createNewFile");
        createNewFile.invoke(file);

        //file的运行类型就是File
        System.out.println(file.getClass());
        System.out.println("文件创建成功"+fileAllPath);

    }
}

 

 

 

 

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

喵俺第一专栏

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值