反射详解

**

反射详解

**
1.反射的概念
2.反射的作用
3.JDK提供的反射机制
4.反射的具体实现(API)
5.反射的应用

1.反射的概念
主要是指程序可以访问,检测和修改它本身状态或行为的一种能力,并能根据自身行为的状态和结果,调整或修改应用所描述行为的状态和相关的语义。
反射是Java中一种强大的工具,能够使我们很方便的创建灵活的代码,这些代码可以再运行时装配,无需在组件之间进行源代码链接。但是反射使用不当会成本很高!
PS:通过反射的机制创建对象,获取类中的属性和方法,并调用类中的属性和方法;以上的总结就是什么是反射,反射就是把java类中的各种成分映射成一个个的Java对象
例如:一个类有:成员变量、方法、构造方法、包等等信息,利用反射技术可以对一个类进行解剖,把个个组成部分映射成一个个对象。

2.反射的作用
反编译:.class–>.java
通过反射机制访问java对象的属性,方法,构造方法等;这样好像更容易理解一些,下边我们具体看怎么实现这些功能。

3.JDK提供的反射类
java.lang.Class;
java.lang.reflect.Constructor;
java.lang.reflect.Field;
java.lang.reflect.Method;
java.lang.reflect.Modifier;

4…反射的API
获取类的方法:
Class.forName (“类的全路径”);
类名.class
对象.getClass();
创建对象
newInstance();
获取属性
public Field[] getFields(); 获取当前class中所有的公共属性
public Field getField(String name); 获取当前class中指定属性名的公共属性
public Field[] getDeclaredFields(); 获取当前class中所有的属性包含私有的
public Field getDeclaredField(String name); 获取当前class中指定属性名的属性包含私有的
获取方法
public Method getMethod(String name, Class<?>… parameterTypes) 获取指定方法名和参数列表的方法
public Method[] getMethods() 获取所有的方法
public Method getDeclaredMethod(String name,Class<?>… parameterTypes) 获取指定方法名和参数列表的方法,包含私有的
public Method[] getDeclaredMethods() 获取所有的方法,包含私有的
执行方法:
调用Method对象中的public Object invoke(Object obj, Object… args)方法。
5.反射的应用
反射的应用:Servlet、各大框架… 等都利用了java的反射机制;
例:简单工厂模式+反射改进
连接不同的数据库

/**
 * 数据库接口
 * @author Administrator
 *
 */
public interface DataSource {
   public void init();
   public void select();
   public void insert();
}
/**
 * 数据库抽象类:可以扩展
 * @author Administrator
 *
 */
public abstract class AbstractDataSource implements DataSource {
   private String driverClass;
   private String url;
   private String user;
   private String password;
   
}
public class Oralce extends AbstractDataSource {
   @Override
   public void init() {
      System.out.println("Oracle连接成功...");
   }
   @Override
   public void select() {
      System.out.println("Oralce查询....");
   }
   @Override
   public void insert() {
      System.out.println("Oralce添加....");
   }
}
public class MySql extends AbstractDataSource {
   @Override
   public void init() {
      System.out.println("Mysql连接成功...");
   }
   @Override
   public void select() {
      System.out.println("Mysql查询...");
   }
   @Override
   public void insert() {
      System.out.println("Mysql添加...");
   }
}
public class Factory {
   public static DataSource getDataSource(String className) {
      DataSource dataSource = null;
      try {
        Class c = Class.forName(className);
        dataSource=(DataSource) c.newInstance();
      } catch (ClassNotFoundException e) {
        e.printStackTrace();
      } catch (InstantiationException e) {
        e.printStackTrace();
      } catch (IllegalAccessException e) {
        e.printStackTrace();
      }
      return dataSource;
   }
}
public class Test {
   
   public static void main(String[] args) {
      //com.mxp.db.MySql
      //com.mxp.db.Oralce
      DataSource dataSource = Factory.getDataSource("com.mxp.db.Oralce");
      dataSource.init();
      dataSource.select();
      dataSource.insert();
   }
}
模仿servlet
/**
 * 预订义好的抽象类
 * @author Administrator
 *
 */
public abstract class HttpServlet {
   public abstract void doGet();
   public abstract void doPost();
}
/**
 * 反射并调用HttpServlet中的方法
 * @author Administrator
 *
 */
public class Servlet {
   /**
    * @param method :get  post
    * @param className
    */
   public void execute(String method, String className) {
      try {
        Class c = Class.forName(className);
        HttpServlet servlet = (HttpServlet) c.newInstance();
        method = "do" + String.valueOf(method.charAt(0)).toUpperCase() + method.substring(1);
        Method m = c.getMethod(method);
        m.invoke(servlet);
      } catch (Exception e) {
        e.printStackTrace();
      }
   }
}
/**
 * 用户自定义的实现类
 * @author Administrator
 *
 */
public class UserServlet extends HttpServlet {
   @Override
   public void doGet() {
      System.out.println("UserServlet is doGet");
   }
   @Override
   public void doPost() {
      System.out.println("UserServlet is doPost");
   }
}
/**
 * 测试类
 * @author Administrator
 *
 */
public class Test {
   
   public static void main(String[] args) {
      
      String className = "com.mxp.servlet.UserServlet";
      String method = "post";
      Servlet servlet = new Servlet();
      servlet.execute(method, className);
   }
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在Python中,反射是指通过字符串的形式去访问对象的属性、方法和其他成员。Python中的每个对象都有一组内置的特殊属性和方法,比如 `__dict__`、`__class__`、`__name__`、`__bases__` 等等。这些属性和方法可以通过反射机制来访问和操作。 Python中的反射通常涉及到以下三个内置函数: 1. `hasattr(object, attribute)`:检查对象是否具有指定的属性或方法。 2. `getattr(object, attribute[, default])`:获取对象的属性或方法。如果属性或方法不存在,则返回默认值(如果指定了)或引发 AttributeError 异常。 3. `setattr(object, attribute, value)`:设置对象的属性或方法。 下面是一些示例: ```python class MyClass: def __init__(self): self.x = 10 def my_method(self): print("Hello, World!") # 创建一个对象 obj = MyClass() # 使用 getattr 获取对象的属性和方法 print(getattr(obj, 'x')) # 输出: 10 getattr(obj, 'my_method')() # 输出: Hello, World! # 使用 hasattr 检查对象是否具有属性和方法 print(hasattr(obj, 'x')) # 输出: True print(hasattr(obj, 'y')) # 输出: False # 使用 setattr 设置对象的属性和方法 setattr(obj, 'y', 20) print(obj.y) # 输出: 20 setattr(obj, 'my_method', lambda: print("Hello, Python!")) obj.my_method() # 输出: Hello, Python! ``` 除了使用内置函数之外,Python中还有另一种反射机制,即使用元类。元类是用于创建类的类,可以通过元类来动态地创建、修改和删除类的属性和方法。元类的使用超出了本文的范围,感兴趣的读者可以自行学习。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值