(java反射 学生简单的笔记)

先创建Student对象

package reflect;

public class Student {
    private String name;
    private int age;

    private Student(){

        System.out.println("The no-argument constructor executes");
    }

    public Student(String name, int age) {
        System.out.println("The parameter constructor executes");
        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 +
                '}';
    }
}

2.利用两个重要的反射然后获取其中的对象个数

该方法可以无关对象里面是私有还是公共都可以直接获取
@Test
        public void getDeclaredConstructors(){

            //a.第一步:获取类对象
            Class c=Student.class;

            //b.提前类中的全部构造器对象
            Constructor[]constructors=c.getDeclaredConstructors();

            //c.遍历构造器
            for (Constructor constructor : constructors) {
                System.out.println(constructor.getName()+"===>"+constructor.getParameterCount());
            }
        }

   //获取单个对象里面的某个构造器   
     @Test
        public void getDeclaredConstructor() throws Exception {

            //a.第一步:获取类对象
            Class c=Student.class;

            //b.提前类中的全部构造器对象
            Constructor cons=c.getDeclaredConstructor(String.class,int.class );//里面的参数以及对应要找的参数个数所寻找的构造器



            System.out.println(cons.getName()+"===>"+cons.getParameterCount());

        }

3.获取参数里面所有信息的反射方法



        //a.第一步:获取类对象
        Class c=Student.class;

        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("=======================================================");

        Constructor cons1=c.getDeclaredConstructor(String.class,int.class );//定义有参构造器
        System.out.println(cons1.getName()+"===>"+cons1.getParameterCount());

        Student s1= (Student) cons1.newInstance("Animal",1000);
        System.out.println(s1);

//以下为返回结果

    /*reflect.Student===>0
The no-argument constructor executes
Student{name='null', age=0}
=======================================================
reflect.Student===>2
The parameter constructor executes
Student{name='Animal', age=1000}

Process finished with exit code 0*/

4.Filed获取对象名对应的类型

package relfect_field;

/*
* 反射第一步是得到Class对象
*
* 1.Field getField(String name);
*        根据成员变量名获的对应Field对象,只能获得public修饰
*
* 2.Field getDeclareField(String name);
*        根据成员变量名获的对应Field对象,只要申明就可以得到
*
* 3.Field[]getFields();
*        获得所有的成员变量对应的Field对象,只能获得Public的
*
* 4.Field[] getDeclaredFields();
*        获得所有的成员变量对应的Filed对象,只要申明了就可以得到
*
* 小结:
*        获取全部的成员变量:getDeclaredFields();
*        获取某个成员变量:getDeclaredField
*
* */


import org.junit.Test;

import java.lang.reflect.Field;

public class FieldDemo01 {
    /*
    * 获取全部的成员变量
    * Field[]getDeclareFields()
    * 获取所有的成员变量对于的Field对象,只要申明了就可以得到
    * */
    @Test
    public void getDeclaredFields(){

        Class c=Student.class;

        Field[]fields=c.getDeclaredFields();

        for (Field field : fields) {
            System.out.println(field.getName()+"===>"+field.getType());
        }


    }

    /* Field getDeclareField(String name);
       获取某个成员变量
     * */
    @Test
    public void getDeclaredField() throws NoSuchFieldException {

        Class c=Student.class;

        //根据某个名称获取成员变量
        Field f=c.getDeclaredField("age");
        System.out.println(f.getName()+"====>"+f.getType());

        //赋值


    }
}

5.利用反射对其取值和赋值

package relfect_field;

import org.junit.Test;

import java.lang.reflect.Field;

public class FieldDome02 {

    @Test
    public void setField() throws Exception {
        Class c=Student.class;
        //提取某个成员变量
        Field ageF=c.getDeclaredField("age");

        ageF.setAccessible(true);

        //赋值
        Student s=new Student();
        ageF.set(s,18);
        System.out.println(s);

        //取值
        int age= (int) ageF.get(s);

        System.out.println(age);
    }


}

6.Method反射

package relfect_Method;

public class Dog {
    private String name;
    public Dog(){

    }

    public Dog(String name) { this.name = name; }
    public void run(){
        System.out.println("run");
    }
    public void eat(){
        System.out.println("eat");
    }
    private String eat(String name){
        System.out.println("猪神吃"+name);
        return "吃的很开心";
    };
    public static void inAddr(){
        System.out.println("猪神爱吃屎");
    }
    public String getName(){return name;}
    public void setName(String name){this.name=name ;}


}
package relfect_Method;

import org.junit.Test;

import java.lang.reflect.Method;

public class MethodDome01 {

    //反射获取类得到Method方法对象
    /*
    * 1. Method getMethod(String name,Class...args);
    *        根据方法名和参数类型获得对应的方法对象,只能获取public的
    *
    * 2.Method getDeclaredMethod(String name,Class...args);
    *        根据方法名和参数类型获得对应的方法对象,包括private的
    *
    * 3.Method[]getMethod();
    *        获得类中的所有成员方法对象,返回数组,只能获得public修饰的却包含父类的
    *
    * 4.method[]getDeclareMethod();
    *        获得类中的所有成员方法对象,返回数组,只获得本类申明的方法
    *
    * Method的方法执行
    *        Object invoke(Object ojc,Object...args)
    *        参数一:触发的是哪个对象的方法执行.
    *        参数二:args:调用方法时传递的实际参数
    *
    * */


    /*
    * 1.获取类中的所有成员方法对象
    *
    * */
    @Test
    public void getDeclaredMethod(){

        Class c=Dog.class;
        //提取全部方法包括私有的
        Method[]methods=c.getDeclaredMethods();

        for (Method method : methods) {
            System.out.println(method.getName()+"返回值类型 "+method.getReturnType()+"参数名称 "+method.getParameterCount());
        }

    }


    /*
    *
    * 2.获取某个方法对象
    *
    * */
    @Test
    public void GetMethod()throws Exception{

        Class c=Dog.class;
        //提取单个方法包括私有的

        Method m=c.getDeclaredMethod("eat");

        Method m2=c.getDeclaredMethod("eat",String.class);


        m.setAccessible(true);
        m2.setAccessible(true);

          Dog d=new Dog();
          Object o= m.invoke(d);//null
        System.out.println(o);

        m2.invoke(d,"骨头");



    }

}

例子反射作用:

package reflect_zuoyong;

import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.concurrent.ThreadPoolExecutor;

public class list {
    public static void main(String[] args) throws Exception{

        ArrayList<String>list1=new ArrayList<>();
        ArrayList<Integer>list2=new ArrayList<>();

        list2.add(1);list2.add(2);
        Class c=list2.getClass();
        Method add=c.getDeclaredMethod("add", Object.class);
        add.invoke(list2,"猪神");
        System.out.println(list2);
        



    }
}

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值