java反射

        反射,我看过一些资料,但是感觉对它没有一个较深入的了解,总结下自己学到的东西!

1.先建一个实体类,代码如下:

package com.great.ReflectMethod;

/**
 * 学生测试类
 */
public class Student {
    private String id;
    private String name;
    private int age;
    public int a;

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

    private void gg(String a){
        System.out.println("ggggg-------"+a);
    }

    private void gg(){
        System.out.println("ggggg-------");
    }
    @Override
    public String toString() {
        return "Student{" +
                "id='" + id + '\'' +
                ", name='" + name + '\'' +
                ", age=" + age +
                '}';
    }

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    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;
    }

    public int getA() {
        return a;
    }

    public void setA(int a) {
        this.a = a;
    }
}
Test.java

package com.great.ReflectMethod;

/**
 * 测试类
 */
public class Test {
     static {
         System.out.println("aaaaaaaaa=---------");
     }
     public String doRun(String pk,Student stu,String testrun) {
         return pk+stu+testrun;
     }
}

2.获取类的三种方法,代码如下:

public static void main(String[] args) throws Exception {
        Class c = (Class) Test.class;
        System.out.println(c);
/**
 * 通过结果可以看出在使用 类名.class获得Class实例时,并不会触发类的初始化,
 * 而 Class.forName方法就会触发,当然实例化对象肯定也是会触发的,
 * 但因为static代码块只执行一次,所以不会再有打印,最后的打印,说明一个类的Class实例只有唯一的一个
 */
        Class test1 = new Test().getClass();
        System.out.println(test1);

        Class clz = Class.forName("com.great.ReflectMethod.Test");
        System.out.println(clz);
}

运行结果如下:

hhhhhhhhh----
class com.great.ReflectMethod.Test
aaaaaaaaa=---------
class com.great.ReflectMethod.Test
class com.great.ReflectMethod.Test

3.通过类获取实例的方法:

/**
 *  对于有空的构造函数的类可以直接用字节码文件获取实例:
        Object objt = clazz.newInstance();  //会调用空参构造器(如果没有则会报错);
 */
        Test test=(Test) clz.newInstance();
        Method mt=clz.getMethod("doRun", new Class[]{String.class,Student.class,String.class});//获取方法
        System.out.println(mt);
        Object[] a = new Object[]{"i love you ",new Student("ss","ss",12),"i fuck you",};
        mt.invoke(test,a);//方法调用
        System.out.println(mt.invoke(test, new Object[]{"i love you ",new Student("ss","ss",12),"i fuck you",}));
/**
 对于没有空的构造函数的类则需要先获取到他的构造对象,在通过该构造方法类获取实例
   1、获取构造函数
        Constroctor const = clazz3.getConstructor(String.class,Student.class,String.class);
   2、通过构造器对象的newInsttance方法进行对象的初始化
      Object obj = const.newInstance("AA",new Student,"aaa");
 */
        //一:获取多个对象(暂时不知道作用)
        Class sClass1 = Class.forName("com.great.ReflectMethod.Student");
        Constructor[] consts1 = sClass1.getConstructors();
        Student student1 = (Student)consts1[0].newInstance("cc","cc",12);
        System.out.println(student1.toString());
        //二:获取单个对象
        Class sClass = Class.forName("com.great.ReflectMethod.Student");
        Constructor<?> consts = sClass.getConstructor(new Class[]{String.class,String.class,int.class});
        Student student = (Student)consts.newInstance("aa","aa",12);
        System.out.println(student.toString());

结果:

public java.lang.String com.great.ReflectMethod.Test.doRun(java.lang.String,com.great.ReflectMethod.Student,java.lang.String)
aaaaaaaaa=---------
i love you Student{id='ss', name='ss', age=12}i fuck you
Student{id='cc', name='cc', age=12}
Student{id='aa', name='aa', age=12}
ggggg-------
Student{id='aa', name='aa', age=10086}

4.通过类获取公共方法,成员和私有方法,私有成员,调用方法和为成员赋值(私有和公有)

 Class c = (Class) Student.class;
        System.out.println(c);
        
        System.out.println("类名:"+c.getName());
        System.out.println("包名:"+c.getPackage());
        System.out.println("父类名:"+c.getSuperclass().getName());
        System.out.println("========成员变量========");
        Field[] fields = c.getDeclaredFields();//获得所有成员变量
        for (Field field : fields) {
            System.out.println(field.getType().getSimpleName() +"  "+ field.getName());
        }
        System.out.println("xxxx公有成员变量xxxx");
        Field[] fields1 = c.getFields();
        for (Field field : fields1) {
            System.out.println(field.getType().getSimpleName() +"  "+ field.getName());
        }
        System.out.println("========成员方法========");
        //成员方法
        System.out.println("xxxx全部成员方法xxxx");
        Method[] methods =  c.getDeclaredMethods();
        for (Method method : methods) {
            System.out.println(method.getName()+"()");
        }
        System.out.println("xxxx公有成员方法xxxx");
        Method[] methods1 =  c.getMethods();
        for (Method method : methods1) {
            System.out.println(method.getName()+"()");
        }

        System.out.println("========构造方法========");
        //构造方法
        System.out.println("xxxx全部构造方法xxxx");
        Constructor[] constructors = c.getDeclaredConstructors();
        for (Constructor constructor : constructors) {
            System.out.println(constructor.getName()+"()");
        }
        System.out.println("xxxx公有构造方法xxxx");
        Constructor[] constructors1 = c.getConstructors();
        for (Constructor constructor : constructors1) {
            System.out.println(constructor.getName()+"()");
        }

结果:

class com.great.ReflectMethod.Student
类名:com.great.ReflectMethod.Student
包名:package com.great.ReflectMethod
父类名:java.lang.Object
========成员变量========
String  id
String  name
int  age
int  a
xxxx公有成员变量xxxx
int  a
========成员方法========
xxxx全部成员方法xxxx
toString()
getName()
getId()
setName()
doRun()
gg()
gg()
setId()
getAge()
setAge()
getA()
setA()
xxxx公有成员方法xxxx
toString()
getName()
getId()
setName()
doRun()
setId()
getAge()
setAge()
getA()
setA()
wait()
wait()
wait()
equals()
hashCode()
getClass()
notify()
notifyAll()
========构造方法========
xxxx全部构造方法xxxx
com.great.ReflectMethod.Student()
xxxx公有构造方法xxxx
com.great.ReflectMethod.Student()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值