`
liguanyi11111
  • 浏览: 62802 次
  • 性别: Icon_minigender_1
  • 来自: 黑龙江
社区版块
存档分类
最新评论

Java类的反射与动态加载

 
阅读更多

       java的反射机制我也是刚刚了解。只能算初学。这里写下这些纯是为了以后查看方便。所以没什么心得,纯粹是一些知识整理,和我做的一点总结的代码。

       反射,说起来挺高端。其实内容却是很简单的。由于类加载进内存中的时候,属性方法等都已经储存在了内存中。所以既然已经存在,就可以通过一定方式将其取出。所以反射机制就出现了,就是通过类Class来调用其特定的反射api就可以取出其所有的属性,方法等等。不多说看代码吧。

 

//获取父类
	private String getSuperClass(Class c){
		Class superC=c.getSuperclass();
		if(null!=superC){
			String name=superC.getName();
			return name;
		}
		return null;
	}

 

//获取属性的类型和名字
	private String[] getFields(Class c){
		Field[] fields=c.getFields();
		if(null!=fields){
			String[] names = new String[fields.length];
			for(int i=0;i<fields.length;i++){
				String name=fields[i].getName();
				String type=fields[i].getType().getName();
				String modifier=Modifier.toString(fields[i].getModifiers());
				names[i]=modifier+" "+type+" "+name;
			}
			return names;
		}
		return null;
	}

 等等包括构造器,所有方法实现的接口等等都可以获得。这里就不全部显示了。全部的代码已上传。通过全部代码可以像java代码一样显示出来,例如显示javax.swing.JFrame类。结果如下图:



 是不是很有意思呢,不要要看到源码只要取得他的一个对象通过getClass就可以得到他的基本结构。如果再详细的话甚至连存在于此元素上的所有注释都可以显示出来。发射机制在java中的使用非常的广泛,例如数据库操作的ORM框架,反射一般配合着动态加载来使用,这样可以降低代码直接的耦合性,做到高内聚低耦合让代码的维护与添加功能变得更加简单。

       对于类的动态加载。其实就是一代码:Class.forName();而这句话有什么用处呢。基本的创建对象我们再熟悉不过了。A   a = new A();   a.xxx();这就是常见的静态编译静态绑定。而何为动态绑定呢,如下:

Class c = Class.forName("A的全路径");  Object object = c.newInstance("构造参数");  A a=(A)object;  a.xxx()

大家可能很疑惑,这究竟有什么用,反而把一段简单的创建对象代码变得复杂。因为不好说清楚,所以这里就不多说了,若你研究过MVC框架或者IOC模式,想必你就非常理解动态编译的作用。对于动态创建对象,调用方法都很简单,就是两句话:newInstance(...)和method.invoke(对象,参数..)十分简单。下面写出一个自己写的一个简易ORM框架,通过动态编译来实现低耦合。让代码根据不同的类自动生成SQL语言,而不必在用硬编码写入数据库控制代码中。首先ORM框架有一个需要遵守的规则。也就是JAVA操作数据库的基本规则,首先一个表对应一个类,表的表名对应类名,表的字段名对应类的属性名,并且类的属性要有其自己的get与set方法,基于这个规定。我的数据库表对应的类如下:

public class Student {
	private int Id;
	private String Name;
	public int getId() {
		return Id;
	}
	public void setId(int id) {
		this.Id = id;
	}
	public String getName() {
		return Name;
	}
	public void setName(String name) {
		this.Name = name;
	}
} 

我所写的简易将对象存入数据库的方法如下:

public static String getSaveSql(Object object){
		String sql="insert into ";
		Class c=object.getClass();
		Method[] methods = c.getMethods();
		String name = c.getName();
		name=name.substring(name.lastIndexOf(".")+1, name.length());
		sql+=name+"(";
		List<String> mlist = new ArrayList<String>();
		List<Object> vlist = new ArrayList<Object>();
		for(Method m:methods){
			String methodName = m.getName();
			if(methodName.startsWith("get")&&!methodName.startsWith("getClass")){
				mlist.add(methodName.substring(3,methodName.length()));
				try{
					Object ob =m.invoke(object, null); 
					if(ob instanceof String){
						vlist.add("'"+ob+"'");
					}else{
						vlist.add(ob);
					}
				}catch(Exception e){
					e.printStackTrace();
				}
			}
		}
		String values ="values(";
		for(int i=0;i<mlist.size();i++){
			if(i!=mlist.size()-1){
				sql+=mlist.get(i)+",";
				values+=vlist.get(i).toString()+",";
			}else{
				sql+=mlist.get(i)+")";
				values+=vlist.get(i).toString()+")";
			}
		}
		sql+=values;
		//通过Connection执行sql语句.................略
		return sql;
	}

 经测试可以生成对应的SQL语句。然后从数据库中提取出一个相应对象方法如下由于没有写连接数据库的代码,所以如下所示只是一个测试,代码并不完整,但是也基本说明问题了:

public static Object getLoadSql(int id,Class c){
		Object object=null;
		try {
			object = c.newInstance();
			Method[] methods = c.getMethods();
			String sql="select * from ";
			String name=c.getName();
			name=name.substring(name.lastIndexOf(".")+1, name.length());
			sql+=name+" where id="+id;
			//获取Connection执行sql语句返回ResultSet..........略
			for(Method m:methods){
				String methodName = m.getName();
				if(methodName.startsWith("set")){
					String SqlName=methodName.substring(3,methodName.length());
					//然后通过字段名获取相应值xx再通过m.invoke(object, xx)存入即可...........代码略
				}
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
		
		//通过ResultSet和上述
		return object;
	}

 这些只不过是反射的一些基本操作,反射的用途十分广泛,尤其是在解决代码耦合方面,由于我也是初学只能说这么多了。更多的只能再去慢慢探索。

 

2014/7/31:

     在android中,反射有个非常重要的功能:获取非API中提供的类的对象,由于android的开源,导致我们完全可以不只是利用API来进行开发,系统内部的一些运行时的static对象,我们都可以通过反射直接拿到,做出一些特殊的举动(例如,注入)。我们也可以用反射得到系统中的一些不暴露的类的对象,例如Android电池信息的获取等。

 

 

  • 大小: 60.3 KB
分享到:
评论

相关推荐

    Java反射动态加载实例类

    ### Java反射机制与动态加载实例类 在Java中,反射是一种强大的工具,允许程序在运行时检查和修改其结构和行为。通过反射,我们可以动态地加载类、创建对象、访问和修改字段、调用方法等。本文将深入探讨Java反射...

    反射,动态加载指定类调用类中的方法

    在“反射,动态加载指定类调用类中的方法”这个主题中,我们将深入探讨如何使用反射来实现动态加载和执行类的方法。首先,我们需要理解几个关键的反射API: 1. `Class&lt;?&gt;`: 这是所有Java类的通用表示,通过`Class....

    JAVA的反射机制与动态代理

    Java的反射机制与动态代理是Java编程中两个非常重要的高级特性,它们在许多实际场景中发挥着关键作用,如框架开发、插件系统、元数据处理等。下面将详细讲解这两个概念及其应用。 首先,Java的反射机制允许我们在...

    Java反射与动态代理

    Java反射是Java编程语言中的一个强大特性,它允许运行中的Java程序对自身进行检查并且可以直接操作程序的内部属性。在Java中,反射机制的核心类包括`Class`、`Field`、`Method`和`Constructor`,它们分别代表类、...

    java反射与动态代理笔记

    Java反射API允许程序在运行时检查类、接口、字段和方法的信息,并能够动态地创建对象和调用方法。这一能力使得Java具有了很高的灵活性,尤其是在处理未知类型的对象或在不修改源码的情况下扩展功能时。 1. **Class...

    java的类反射

    4. 动态代理:Java的`java.lang.reflect.Proxy`类可以创建动态代理,用于在方法调用前后添加自定义逻辑,比如AOP(面向切面编程)。 5. 框架开发:Spring框架的依赖注入、Hibernate的数据持久化等都大量使用反射技术...

    JAVA类加载机制与动态代理

    ### JAVA类加载机制与动态代理 #### 一、类加载机制 ##### 1.1 类加载的时机 类加载机制负责将描述类的数据从`.class`文件加载到内存,并进行必要的校验、转换解析和初始化,使之成为可以被Java虚拟机直接使用的...

    java语言反射与动态代理学习笔记

    ### Java语言反射与动态代理深度解析 #### 一、Java反射机制详解 Java反射机制是Java编程语言的一个强大特性,允许程序在运行时检查和修改自身结构与行为。这一机制为开发人员提供了高度的灵活性,尤其是在框架...

    JAVA 反射机制与动态代理ppt

    总的来说,Java反射机制和动态代理是Java平台强大而灵活的特性,它们使得Java程序能够在运行时具有更高的灵活性和可扩展性。然而,使用反射也可能带来性能开销和安全风险,因此在实际应用中需要权衡利弊,合理使用。

    Java 反射-动态代理

    Java反射和动态代理是Java编程中的重要特性,它们在实现高度灵活和动态的代码执行上发挥着关键作用。本文将深入探讨这两个概念,以及如何在实际开发中利用它们。 首先,我们来理解Java反射(Reflection)。Java反射...

    JAVA的反射机制与动态代理.pdf

    #### 一、JAVA反射机制概述 JAVA的反射机制是一种强大的功能,允许程序在运行时获取类的信息并操作类的对象。这种能力在很多情况下非常有用,比如在进行代码框架设计时,我们经常需要在运行时根据不同的条件选择...

    java反射 java反射 java反射java反射

    Java反射是Java编程语言中的一个重要特性,它允许程序在运行时动态地获取类的信息并操作类的对象。在Java中,反射机制提供了强大的能力,包括在运行时检查类的结构、创建对象实例、调用方法以及访问和修改字段值。...

    java反射机制与动态代理

    ### Java反射机制与动态代理 #### 一、Java反射机制 **Java反射机制**是一种强大的功能,它允许我们在运行时动态地访问类的信息并进行操作。这种能力在很多情况下非常有用,比如在开发框架和库时,我们经常需要在...

    java语言反射与动态代理学习笔记2(动态代理部分)

    在Java编程中,反射和动态代理是两个非常...动态代理尤其适用于需要在方法调用前后添加额外行为的情况,而反射则允许我们在运行时检查和操作类的结构。通过熟练掌握这两个特性,开发者可以写出更加灵活和模块化的代码。

    java 反射机制与动态代理

    Java反射机制与动态代理是Java编程中的重要概念,它们在软件设计中扮演着核心角色,尤其是在框架开发中。本文将深入探讨这两个主题,以及如何在实际应用中利用它们。 首先,我们来理解Java反射机制。反射是Java的一...

    java 反射与动态代理

    Java反射和动态代理是Java编程中的重要特性,它们在实现高度灵活和动态的代码执行上发挥着关键作用。本文将深入探讨这两个概念及其在实际开发中的应用。 **Java反射** Java反射API允许程序在运行时检查类、接口、...

    java 利用反射获取内部类静态成员变量的值操作.docx

    3. **反射**:反射是在运行时检查类、接口、字段和方法等的能力,通常用于实现动态代理或需要动态加载类的场景。 #### 三、核心知识点 接下来,我们将通过一个具体的例子来演示如何使用Java反射获取内部类的静态...

    JAVA反射机制的入门代码

    总的来说,"JAVA反射机制的入门代码"是初学者理解Java反射机制的好教材,通过它,你可以学习如何动态地操作Java类,提高代码的灵活性,并掌握处理`properties`文件的基础方法。在深入学习和实践中,你将进一步理解...

Global site tag (gtag.js) - Google Analytics