学习博客:反射---创造Class文件对象及其使用

// 方式1
//Person P = new Person() ;
// Class C = p.getclass() ;
//方式2 Class c3 =Person. class ;
//方式3 C Class c4 = Class. forName ();

package reflect_study_01;
// 方式1
//Person P = new Person() ;
//        Class C = p.getclass() ;
//方式2   Class c3 =Person. class ;
//方式3 C  Class c4 = Class. forName ("cn.itcast 01.Person"T ;
public class ReflectDemo {
    public static void main(String[] args) throws ClassNotFoundException {
        // 方式1
    Person p1=new Person();
    Class c1=p1.getClass();
    Person p2 = new Person();
    Class c2 =p2.getClass();
        System.out.println(p1==p2);
        System.out.println(c1==c2); // true 证明class文件用的是同一个
//方式2
        Class c3 =Person.class;
        System.out.println(c1==c3);// true 证明class文件用的是同一个
//方式3
        Class c4 =Class.forName("reflect_study_01.Person");//要把路径写清楚
        System.out.println(c4==c1);
    }
}


这里是创造Class文件对象并且使用他的构造方法:

//步骤 1创造一个Class对象指向class文件
// 2获取构造方法对象
// 3创造对象指向构造方法对象
//public Constructor[] getConstructors() :所有公共构造方法
//public Constructor[] getDeclaredConstructors () :所有构造方法
//获取单个构造方法
//public Constructor getConstructor (C1ass<?>… parameterTypes)
// 参数表示的是:你要获取的构造方法的构造参数个数及数据类型的clas s字节码文件对象
//public T newInstance (object. … initargs)
// 使用此Constructor对象表示的构造方法来创建该构造方法的声 明类的新实例,并用指定的初始化参数初始化该实例。

package reflect_study_02;


import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
//步骤 1创造一个Class对象指向class文件
//    2获取构造方法对象
//    3创造对象指向构造方法对象
//public Constructor[] getConstructors() :所有公共构造方法
//public Constructor[] getDeclaredConstructors () :所有构造方法
//获取单个构造方法
//public Constructor<T> getConstructor (C1ass<?>... parameterTypes)
//        参数表示的是:你要获取的构造方法的构造参数个数及数据类型的clas s字节码文件对象
//public T newInstance (object. .. initargs)
//        使用此Constructor对象表示的构造方法来创建该构造方法的声 明类的新实例,并用指定的初始化参数初始化该实例。
public class ReflectDemo {
    public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException {
        Class p=Class.forName("reflect_study_01.Person");
        //Constructor [] c=p.getConstructors();//所有公共构造方法
        //Constructor [] c = p.getDeclaredConstructors();//所有构造方法
//        for (Constructor con:c)
//        {
//            System.out.println(con);
//        }
        Constructor c =p.getConstructor(String.class,int.class);
        Object obj=c.newInstance("zsp",20);
        System.out.println(obj);
    }
}


//需求:通过反射获取私有构造方法并使用
//使用 con.setAccessible(true);为七rue则指示反射的对象在使用时应该取消Java语言访问检查。
public class ReflectDemo {

package reflect_study_03;


import java.lang.reflect.Constructor;

//需求:通过反射获取私有构造方法并使用
//使用 con.setAccessible(true);为七rue则指示反射的对象在使用时应该取消Java语言访问检查。
public class ReflectDemo {
    public static void main(String[] args) throws Exception {
        Class p =Class.forName("reflect_study_01.Person");

        Constructor con =p.getDeclaredConstructor(String.class) ;
        con.setAccessible(true);
        Object obj =con.newInstance("zsp");
        System.out.println(obj);
    }
}

给私有变量赋值:

//Field[] fields =p.getFields();//只能获取公共变量
//Field[] fields =p.getDeclaredFields();//获取全部变量
发现是私有变量及时使用setAccessible(true);

package reflect_study_04;

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

//Class类:
//        成员支量 Field
//        构造方法 Constructor
//        成员方法 Method
//Field[] fields =p.getFields();//只能获取公共变量
//Field[] fields =p.getDeclaredFields();//获取全部变量
public class ReflectDemo {
    public static void main(String[] args) throws ClassNotFoundException, NoSuchFieldException, NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException {
        Class p=Class.forName("reflect_study_01.Person");
        //Field[] fields =p.getFields();//只能获取公共变量
        //Field[] fields =p.getDeclaredFields();//获取全部变量
//        for (Field field:fields)
//        {
//            System.out.println(field);
//        }
        Field fieldname =p.getDeclaredField("name");
        fieldname.setAccessible(true);
        Constructor con =p.getDeclaredConstructor();
        Object obj =con.newInstance();
        fieldname.set(obj,"zsp");
        System.out.println(obj);
    }
}

反射使用成员方法

package reflect_study_05;

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

//        获取所有方法
//        getMethods
//        getDeclaredMethods
//        获取单个方法
//        getMethod
//        getDeclaredMethod
//        暴力访问
//        method. ssetAccessible(true) ;
public class ReflectDemo {
    public static void main(String[] args) throws Exception {
        Class p =Class.forName("reflect_study_01.Person");
       // Method[] methods = p.getMethods();//返回一切公共方法,包括继承到的
       // Method[] methods = p.getDeclaredMethods();//返回自己有的方法
//        for (Method method:methods)
//        {
//            System.out.println(method);
//        }
        Constructor con =p.getDeclaredConstructor();
        Object obj =con.newInstance();
        Method method1 =p.getMethod("show");
        method1.invoke(obj);
        System.out.println("-------------------------------");
        Method method2 =p.getMethod("setAge",int.class);//后面填写的是传过去的参数
        method2.invoke(obj,100);
        System.out.println(obj);
        System.out.println("-----------------------------------");
        Method method3 =p.getMethod("method", String.class, int.class);
        String line = (String) method3.invoke(obj,"zsp",100);
        System.out.println(line);
    }
}

这是我使用到的Class文件:

package reflect_study_01;

public class Person {


    private    String name ;
    public  int age;

    private String getName() {
        return name;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public int getAge() {
        return age;
    }

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

     Person(int age) {
        this.age = age;
    }

    private Person(String name) {
        this.name = name;
    }

    public Person() {
    }
    public  void show(){
        System.out.println("Person{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}');
    }
    public  String method(String name,int age){
        return ""+name+age;
    }
    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值