浅谈Java反射

一、何为反射

  反射就是对于任何一个类都能知道这个类的的所有属性和方法,并且对于任何一个对象都能调用他的属性和方法,而且能修改其属性。

二、反射的作用

  就我的理解来看,通常我们在写代码的时会非常强调代码的逻辑,Java中类之间的链接非常重要,造成很多时候代码耦合度过高,这时会造成很多问题。当使用反射来调用属性和方法时会降低代码的耦合度,更加方便。

三、示例

  这里我写了一个完整的逻辑,其中运用了多个反射类。

  定义两个接口:

package None8;

public interface earth {

}
package None8;

public interface animal {

}

  定义一个父类,为了简化没有写方法和属性:

package None8;

public class simplePerson {

}

  定义一个person类继承上面两个接口和父类:

package None8;

public class person extends simplePerson implements animal,earth{
    String name;
    int age;
    
    public void shwo() {
        String s = String.format("姓名=%s,年龄=%d", name,age);
        System.out.println(s);
    }
    public person() {
        
    }
    
    //这里的构造函数一定要设为public,不然通过动态加载类创建对象时会报错,读取不到这个构造函数
    public person(String name,int age){
        this.name = name;
        this.age = age;
    }
}

  客户端类,运用反射来创建并初始化对象,查看类的继承关系和方法:

package None8;

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

public class client {

    public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {
        // TODO Auto-generated method stub
        
        //通过反射,动态加载对象
        //无参构造函数
        //Class<?> 泛型 里面的?表示可以处理所有是通配符,里面的person表示处理person类
        Class<?> c =Class.forName("None8.person");
        person n =(person)c.newInstance();
        
        n.name = "lemon";
        n.age = 22;
        n.shwo();
        
        //通过反射得到所有构造函数getConstructors
        //这里有多个构造函数,上面的那个不能加载有参数的构造函数
        //通过getConstructors来得到所有的构造函数,构造函数存放在数组中
        //注意,构造函数一定要设为public,不然会报错
        Constructor<?>[] cons = c.getConstructors();
        person m = (person) cons[1].newInstance("sunk",30);
        m.shwo();
        
        
        //通过反射得到所有接口getInterfaces
        //可以将所有继承的接口都展示出来
        //接口同样存放在数组中
        System.err.println("接口有:");
     Class<?>[] inter = c.getInterfaces(); for (int i = 0;i < inter.length;i++) { System.err.println(inter[i].getName()); } System.err.println("父类有:"); //通过反射得到所有父类getSuperclass //Class<? super Object> superc = (Class<? super Object>) c.getSuperclass(); System.err.println(c.getSuperclass().getName()); } }

  运行结果:

  

三、总结

  我在刚接触反射的时最疑惑的就是我们之前通常用的new和反射中Class.forName()与Class.forName().newInstance()三者之间的关系。后来通过查询资料了解了。new只是一个关键字,后两者都是Class类下的方法。Class.forName()在反射中用来动态加载类,创建的对象的类型为该类的类型,这就可以看出来单单使用Class.forName()这个方法所创建的对象我们是无法使用的,这时就要使用newInstance()方法静态方法来实例化对象。

  这里仅仅只是我对反射的浅显的理解,一边学习一边分享!

  如有错误,希望大家能指正,感谢!

  努力努力再努力!

猜你喜欢

转载自www.cnblogs.com/lemonxu/p/10532939.html