框架灵魂——反射

反射的自我介绍

*获取class对象的方式

 

package Demo;

public class Person {
        private String name;
        private int age;
        public  int a;
        public  int b;

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

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

        public int getB() {
            return b;
        }

        public void setB(int b) {
            this.b = b;
        }

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

    public Person() {
    }
}

  

import Demo.Person;

public class Main{
    public static void main(String[] args) throws Exception {
        //第一种方式 Class.forname("全类名");
        Class cls1 = Class.forName("Demo.Person");
        System.out.println(cls1);//class Demo.Person
        //第二种方式 类名.class
        Class cls2 = Person.class;
        System.out.println(cls2);//class Demo.Person
        //第三种方式 对象.getClass()

        Person p=new Person();
        Class cls3= p.getClass();
        System.out.println(cls3);//class Demo.Person
    }
}
 
*class对象的功能
 
1.0获取成员变量
 
 
import Demo.Person;

import java.lang.reflect.Field;

public class Main{
    public static void main(String[] args) throws Exception {
        Class cls = Person.class;
        Field[] fields = cls.getFields();//Public 修饰的成员变量
        for (Field field : fields) {
            System.out.println(field);
        }

        System.out.println("---------------------");

        Field[] fields1 = cls.getDeclaredFields();//所有的成员变量
        for (Field field : fields1) {
            System.out.println(field);
        }
        Field age = cls.getDeclaredField("age");
        System.out.println(age);

        Person p=new Person();
        age.setAccessible(true);//暴力反射
        age.set(p,18);
        Object o = age.get(p);
        System.out.println(o);


    }
}

 

打印结果:

public int Demo.Person.a
public int Demo.Person.b
---------------------
private java.lang.String Demo.Person.name
private int Demo.Person.age
public int Demo.Person.a
public int Demo.Person.b
private int Demo.Person.age
18

 

2.0 获取构造方法

 

import Demo.Person;

import java.lang.reflect.Constructor;

public class Main{
    public static void main(String[] args) throws Exception {
        Class cls = Person.class;
        Constructor constructor = cls.getConstructor(String.class, int.class, int.class, int.class);
        Object v = constructor.newInstance("V", 25, 12, 30);
        System.out.println(v);
        System.out.println("空参构造方法");
        Constructor constructor1 = cls.getConstructor();
        Object o = constructor1.newInstance();
        System.out.println(o);
        Object o1 = cls.newInstance();
        System.out.println(o1);

    }

}

3.0 获取成员方法

 

 

import Demo.Person;

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

public class Main{
    public static void main(String[] args) throws Exception {
        Class cls = Person.class;
        Method[] methods = cls.getMethods();//person类继承了object类
        for (Method method : methods) {
            System.out.println(method);
            System.out.println(method.getName());
        }
        Method method = cls.getMethod("eat");
        Person person=new Person();
        method.invoke(person);

        Method method1 = cls.getMethod("eat",String.class);
        Person p=new Person();
        method1.invoke(p,"披萨");
    }

}

  

public java.lang.String Demo.Person.toString()
toString
public java.lang.String Demo.Person.getName()
getName
public void Demo.Person.setName(java.lang.String)
setName
public int Demo.Person.getAge()
getAge
public void Demo.Person.eat()
eat
public void Demo.Person.eat(java.lang.String)
eat
public void Demo.Person.setAge(int)
setAge
public void Demo.Person.setA(int)
setA
public int Demo.Person.getB()
getB
public int Demo.Person.getA()
getA
public void Demo.Person.setB(int)
setB
public final void java.lang.Object.wait(long,int) throws java.lang.InterruptedException
wait
public final void java.lang.Object.wait() throws java.lang.InterruptedException
wait
public final native void java.lang.Object.wait(long) throws java.lang.InterruptedException
wait
public boolean java.lang.Object.equals(java.lang.Object)
equals
public native int java.lang.Object.hashCode()
hashCode
public final native java.lang.Class java.lang.Object.getClass()
getClass
public final native void java.lang.Object.notify()
notify
public final native void java.lang.Object.notifyAll()
notifyAll
吃什么好呢?
那就吃披萨好了

  

 案例

 

 

配置文件:Demo01/src/pro.Properties

classname=Demo.Person
methodname=eat

  

package Demo;

import java.io.InputStream;
import java.lang.reflect.Method;
import java.util.Properties;

public class TestPractice {
    public static void main(String[] args) throws Exception{
        Properties pro=new Properties();
        //类加载器 获取class目录下的文件
        ClassLoader classLoader=TestPractice.class.getClassLoader();
        InputStream stream = classLoader.getResourceAsStream("pro.Properties");
        pro.load(stream);

        String classname = pro.getProperty("classname");
        String methodname = pro.getProperty("methodname");

        Class cls = Class.forName(classname);
        Object o = cls.newInstance();//空参构造方法

        Method method = cls.getMethod(methodname);//方法参数

        method.invoke(o);

    }


}

 

打印结果:

吃什么好呢?

posted @ 2020-07-05 11:01  YUNNEN  阅读(253)  评论(0编辑  收藏  举报