前言:
此时同学们对“python反射”大体比较注重,姐妹们都需要剖析一些“python反射”的相关知识。那么小编同时在网摘上搜集了一些对于“python反射””的相关知识,希望你们能喜欢,姐妹们快快来了解一下吧!《大数据和人工智能交流》头条号向广大初学者新增C 、Java 、Python 、Scala、javascript 等目前流行的计算机、大数据编程语言,希望大家以后关注本头条号更多的内容。
Java反射是Java程序在运行过程中获取类的对象、属性和方法,它是一个动态的概念。注意反射是从Java字节码中获取类对象的内容属性和方法等信息,而不是从静态的代码编译后的类中获取
有时候我们往往需要在系统运行过程中获取类的相关信息,有人说你 new 该类对象不就完事了吗?不好意思,系统正在运行重要的应用不可能停下来让你修改代码,有的系统也没有现成的源代码供你修改!比如系统正在炒股,老板说我的数据在那台服务器需要切换数据库。炒股的软件可能是买的软件,它运行的类只是给你提供些属性和方法,首先你不可能停机修改代码哪怕一秒也不行原因自己想,就算停机也没有现成的代码给你修改!这样就限制了系统的可扩展性,那么Java的反射技术是其中的一个解决方案,后面将给大家一个参考案例
Java的思想是一切皆为对象,那么想获取字节码的内容当然字节码也是对象,我们管它叫做类对象,即类也是对象我们叫做Class
Class的定义如下:
class Class{
字节码文件中的字段;
字节码文件中的构造函数;
字节码文件中的一般函数;
}
一、获取类对象(字节码对象)的三种途径
1、Object类的getClass()方法
Computer computer = new Computer();
Class c=computer.getClass();
2、class属性
Class c1=Computer.class;
3、使用Class.forName
Class c=Class.forName("com.Computer");
二、获取类对象的构造函数
public class Computer {
public Computer(String maker,int type){
System.out.println(maker);
System.out.println(type);
}
}
import java.lang.reflect.Constructor;
public class Test
{
public static void main(String[] args) throws Exception
{
String name="com.Computer";
Class c=Class.forName(name);
Constructor constructor=c.getConstructor(String.class,int.class)
Object obj=constructor.newInstance("宏基电脑",111111);
}
}
三、获取类对象中的字段
String name="com.Computer";
Class c=Class.forName(name);
Field field=c.getDeclaredField("type");
Object obj1=c.newInstance();
field.set(obj1, "海尔电脑");
Object obj2=field.get(obj1);
System.out.println(obj2);
四、获取类对象中的方法
public class Computer {
public String type;
public Computer(String maker,int type){
System.out.println(maker);
System.out.println(type);
}
public Computer(){ }
public void f1(){
System.out.println("这是f1方法");
}
private void f2(){
System.out.println("这是f2方法");
}
public void f3(String s,int i){
System.out.println(s+i);
}
}
获取本类所有方法如下:
String name="com.Computer";
Class c=Class.forName(name);
Method[] methods=c.getDeclaredMethods();
for(Method method:methods){
System.out.println(method);
}
调用并且运行空参数的方法
String name="com.Computer";
Class c=Class.forName(name);
//获得方法f1,并且是空参数
Method method=c.getMethod("f1", null);
Object obj=c.newInstance();
//调用该方法
method.invoke(obj, null);
调用并运行有参数的方法
String name="com.Computer";
Class c=Class.forName(name);
Method method=c.getMethod("f3", String.class,int.class);
Object obj=c.newInstance();
method.invoke(obj, "Hello",123);
五、使用Java反射实现系统的可扩展性案例
案例概述:
我们说数据的类型有文本类型、Excel类型、mysql类型等,那么对数据的操作有正删改查,那么如何做到从一种数据类型切换到另一种数据类型不需要修改代码呢?看如下实现
(1)Dao层
package dao;
public interface Dao {
public void add();
}
(2)数据访问实现层
package dao.impl;
import dao.Dao;
public class MySqlDao implements Dao{
public void add() {
System.out.println("这是向mysql新增数据");
}
}
package dao.impl;
import dao.Dao;
public class TxTDao implements Dao{
public void add() {
System.out.println("这是向txt新增数据");
}
}
(3)业务层
package service;
import dao.Dao;
public class MySqlService {
Dao dao;
public void setDao(Dao dao) {
this.dao = dao;
}
public void addData(){
dao.add();
}
}
那么控制层代码 使用反射技术,可以做到代码不修改,在配置文件里面配置
配置文件applicationContext.properties,文件格式如下:
classId=dao.impl.MySqlDao
代码如下:
MySqlService mySqlService = new MySqlService();
Properties properties = new Properties();
properties.load(new FileInputStream(new File("applicationContext.properties")));
String cname=properties.getProperty("classId");
System.out.println(cname);
Class c=Class.forName(cname);
Dao dao=(Dao)c.newInstance();
mySqlService.setDao(dao);
mySqlService.addData();
《大数据和人工智能交流》的宗旨
1、将大数据和人工智能的专业数学:概率数理统计、线性代数、决策论、优化论、博弈论等数学模型变得通俗易懂。
2、将大数据和人工智能的专业涉及到的数据结构和算法:分类、聚类 、回归算法、概率等算法变得通俗易懂。
3、最新的高科技动态:数据采集方面的智能传感器技术;医疗大数据智能决策分析;物联网智慧城市等等。
根据初学者需要会有C语言、Java语言、Python语言、Scala函数式等目前主流计算机语言。
根据读者的需要有和人工智能相关的计算机科学与技术、电子技术、芯片技术等基础学科通俗易懂的文章。
标签: #python反射