java反射

反射机制:

   在运行状态中   对于任意一个类,都能够知道这个类的所有的属性和方法

获取class 的三种方式:

  1、    Class    clazz1 = Class.forName("com.heima.bean.Person");         //    Class  的静态方法   通过全类名  获取运行类

  2、    Class clazz2 = Person.class;                                                          // 通过.class文件 

  3、   Person p = new Person();               Class clazz3 = p.getClass();    // Object的getClass()方法

反射如何拿到构造方法:
        clazz.newInstance()        //只能拿空参              
        
        Class clazz = Class.forName("com.heima.bean.Person");           
        Constructor c = clazz.getConstructor(String.class,int.class);       //拿有参构造的对象  :  先获取类Class对象 ,然后用getConstructor(参数) 
public class demon3_reflect {

    public static void main(String[] args) throws Exception {
        Class clazz = Class.forName("com.heima.bean.Person");
        Constructor c = clazz.getConstructor(String.class,int.class);
        Person p = (Person) c.newInstance("张三",23);
        System.out.println(p);
    }

}

 

public class demon2_reflect {

    public static void main(String[] args) throws Exception {
        Juicer j = new Juicer();
        BufferedReader br = new BufferedReader(new FileReader("config.properity"));   //  读取配置文件中的全类名(带包名的类名)     再用forName()  反射获取类
        Class clazz = Class.forName(br.readLine());    
        fruit f = (fruit)clazz.newInstance();         //   获取到空参构造      父类引用指向子类对象
        j.run(f);
    }
}

interface fruit {
    public abstract void squeeze();
    
}
class Apple implements fruit{
    public void squeeze() {
        System.out.println("炸出一杯苹果汁");
    }
}

class Orange implements fruit{
    public void squeeze() {
        System.out.println("炸出一杯juzi汁");
    }
}

class Juicer {
    public void run(fruit f) {
        f.squeeze();
    }
}

 

通过反射 获取成员变量并使用

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

import com.heima.bean.Person;

public class demon4_field {
    /*
     * 反射 获取成员变量
      Field f = clazz.getField("变量名")
      f.set(对象名,变量名) // 改变变量值
      如果 该变量被私有了,可以先 f.setAccessible(true) ,在调用set() 暴力反射 */ public static void main(String[] args) throws Exception { Class clazz = Class.forName("com.heima.bean.Person"); // 获取类对象 Constructor c = clazz.getConstructor(String.class,int.class);   // clazz.getContructor(参数) 获取有参构造对象 Person p = (Person) c.newInstance("张三",23);       // 通过有参构造,创建类对象 /*Field f = clazz.getField("name"); f.set(p, "李四");*/ Field f = clazz.getDeclaredField("name"); f.setAccessible(true);      // 暴力反射  f.set(p, "李四"); System.out.println(p); } }

 

 

获取方法:

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

import com.heima.bean.Person;

public class demon5_method {

    public static void main(String[] args) throws Exception {
        Class clazz = Class.forName("com.heima.bean.Person");        
        Constructor c = clazz.getConstructor(String.class,int.class);
        Person p = (Person) c.newInstance("张三",23);
        Method m = clazz.getMethod("eat");       //获取eat方法
        m.invoke(p);
        
        Method m2 = clazz.getMethod("eat", int.class);    //  获取带参数的 eat()方法
        m2.invoke(p, 2);
    }

}

 

上一篇:latex安装教程(texlive+texstudio)并添加IEEE模板


下一篇:MySQL外键