java:反射(Hibernate的雏形)
* java.lang.Class类:Class类的实例表示正在运行的 Java 应用程序中的类和接口,没有构造方法。
java反射机制是在运行状态中,对于任何一个类,都能够知道这个类的所有属性和方法,对于任意一个对象想,都能够调用他的任意一个方法和属性,这种动态获取的信息以及动态调用对象的方法的功能称为java的反射机制。
*
* 常用方法:
* forName(String className) 返回与带有给定字符串名的类或接口相关联的 Class 对象。
* Field[] getDeclaredFields()返回 Field对象的一个数组,这些对象反映此 Class 对象所表示的类或接口所声明的所有字段。
* Method[] getDeclaredMethods() 返回 Method对象的一个数组,这些对象反映此 Class 对象表示的类或接口声明的所有方法,
* 包括公共、保护、默认(包)访问和私有方法,但不包括继承的方法。(该类中的方法信息)
Constructor[] Constructor<?>[] getDeclaredConstructors()
返回 Constructor 对象的一个数组,这些对象反映此 Class 对象表示的类声明的所有构造方法。
* java.lang.reflect.Field类:Field 提供有关类或接口的单个字段的信息,以及对它的动态访问权限(获取属性的信息)
* 常用方法:
* getModifiers() 以整数形式返回由此 Field 对象表示的字段的 Java语言修饰符。
* 1:public 2:private 4:protected 0:默认
* getName()返回此 Field 对象表示的字段的名称。
* getType() 返回一个 Class 对象,它标识了此 Field 对象所表示字段的声明类型。
*
* java.lang.reflect.Method类:Method 提供关于类或接口上单独某个方法(以及如何访问该方法)的信息
* 常用方法:
* getModifiers() 以整数形式返回此 Method 对象所表示方法的 Java 语言修饰符。
* getReturnType()返回一个 Class 对象,该对象描述了此 Method 对象所表示的方法的正式返回类型。
* getName() 以 String 形式返回此 Method 对象表示的方法名称。
* getParameterTypes() 按照声明顺序返回 Class 对象的数组,这些对象描述了此 Method 对象所表示的方法的形参类型。
* getExceptionTypes() 返回 Class 对象的数组,这些对象描述了声明将此 Method 对象表示的底层方法抛出的异常类型。
*
* java.lang.reflect.Constructor类:
* 常用方法:
* getModifiers() 以整数形式返回此 Constructor 对象所表示构造方法的 Java 语言修饰符。
* getName() 以字符串形式返回此构造方法的名称。
* getParameterTypes()按照声明顺序返回一组 Class 对象,这些对象表示此 Constructor 对象所表示构造方法的形参类型。
public class Student {
private String name;
private int age;
public Student(){
}
public Student(String name,int age){
this.name=name;
this.age=age;
}
public void intro(){
System.out.println("姓名:"+name);
System.out.println("年齡:"+age);
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
public class TestClass {
public static void main(String[] args) {
// Student student = new Student();
// Class student = Student.class;
try {
Class clazz = Class.forName("cn.zzsxt.reflect1.Student");
System.out.println("------属性信息--------");
//获取该类中声明的属性(字段)
Field[] fields = clazz.getDeclaredFields();
for (Field field : fields) {
int modifier = field.getModifiers();//获取字段的修饰符
Class fieldType = field.getType();//获取字段数据类型
String fieldName = field.getName();//获取字段的名称
System.out.println(modifier+"----"+fieldType+"----"+fieldName);
}
System.out.println("--------方法信息---------");
Method[] methods = clazz.getDeclaredMethods();
for (Method method : methods) {
int modifier = method.getModifiers();//获取方法的修饰符
Class returnType = method.getReturnType();//获取返回值类型
String methodName = method.getName();//获取方法名
Class[] paraTypes = method.getParameterTypes();
Class[] exceptionTypes = method.getExceptionTypes();
System.out.println(modifier+"---"+returnType+"---"+methodName+"---"+Arrays.toString(paraTypes)+"---"+Arrays.toString(exceptionTypes));
}
System.out.println("----------构造方法-------------");
Constructor[] constructors = clazz.getDeclaredConstructors();
for (Constructor constructor : constructors) {
int modifier = constructor.getModifiers();
String conName = constructor.getName();
Class[] conTypes= constructor.getParameterTypes();
System.out.println(modifier+"---"+conName+"---"+Arrays.toString(conTypes));
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
}
* java.lang.reflect.Method类
* invoke(Object obj, Object... args)
* 对带有指定参数的指定对象调用由此 Method 对象表示的底层方法。(回调方法)
import java.lang.reflect.Field; /**
* java.lang.Class类
* getDeclaredField(String name)
返回一个 Field 对象,该对象反映此 Class 对象所表示的类或接口的指定已声明字段
*
*
* java.lang.reflect.Field类:描述类或接口的字段信息
* getModifiers() 以整数形式返回由此 Field 对象表示的字段的 Java语言修饰符。
* 1:public 2:private 4:protected 0:默认
* getName()返回此 Field 对象表示的字段的名称。
* getType() 返回一个 Class 对象,它标识了此 Field 对象所表示字段的声明类型。
* set(Object obj, Object value)将指定对象变量上此 Field 对象表示的字段设置为指定的新值。
* get(Object obj) 返回指定对象上此 Field 表示的字段的值。
*
*
*/
public class TestField {
public static void main(String[] args) {
try {
Class clazz = Class.forName("cn.zzsxt.reflect1.Student");//动态加载类
Object obj = clazz.newInstance();//动态创建对象 Student student = new Student(); //获取name字段信息
Field field = clazz.getDeclaredField("name");
field.setAccessible(true);
field.set(obj, "zhangsan");//为obj对象的name属性设置
Object value = field.get(obj);
System.out.println(value);
} catch (Exception e) {
e.printStackTrace();
} }
}
import java.lang.reflect.Method;
/**
* java.lang.reflect.Method类
* invoke(Object obj, Object... args)
* 对带有指定参数的指定对象调用由此 Method 对象表示的底层方法。(回调方法)
*
*/
public class TestMethod {
public static void main(String[] args) {
try {
Class clazz = Class.forName("cn.zzsxt.reflect1.Student");
Object obj = clazz.newInstance();//动态创建对象Student student = new Student();
Method setName = clazz.getDeclaredMethod("setName", String.class);//获取setName方法
//student.setName("zhangsan");
//回调setter方法
setName.invoke(obj, "zhangsan");//第一个参数是对象,第二个参数是方法中实参
Method getName = clazz.getDeclaredMethod("getName", null);//获取getName方法
//回调getter方法
Object returnValue = getName.invoke(obj, null);
System.out.println(returnValue);
} catch (Exception e) {
e.printStackTrace();
}
}
}
import java.lang.reflect.Constructor; /**
*java.lang.reflect.Constructor类
* newInstance(Object... initargs)
使用此 Constructor 对象表示的构造方法来创建该构造方法的声明类的新实例,并用指定的初始化参数初始化该实例。
*
*/
public class TestConstractor {
public static void main(String[] args) {
try {
Class clazz = Class.forName("cn.zzsxt.reflect1.Student");
//获取指定参数的构造方法
Constructor constructor = clazz.getDeclaredConstructor(String.class,int.class);
Object obj = constructor.newInstance("zhangsan",);//Student stu = new Student("zhangsan",20);
System.out.println(obj);
} catch (Exception e) {
e.printStackTrace();
} }
}
* Hibernate的雏形
* User user = new User(1,"zhangsan","123");
* Student student = new Student("lisi",20);
* save(user)
* ----> insert into User(userId,userName,password) values('1','zhangsan','123');
* save(student)
* ----> insert into Student(name,age) values('lisi','20');
public class User {
private int userId;
private String userName;
private String password;
public User(){
}
public User(int userId,String userName,String password){
this.userId=userId;
this.userName=userName;
this.password=password;
}
public int getUserId() {
return userId;
}
public void setUserId(int userId) {
this.userId = userId;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
public class MyHibernate {
public static void save(Object obj) throws Exception{
StringBuilder sb = new StringBuilder("insert into ");
Class clazz = obj.getClass();
// String className = clazz.getName();//全类名(报名+类名)
String className = clazz.getSimpleName();//获取简单类名(类名)
sb.append(className+"(");//insert into User(
//获取类的属性信息
Field[] fs = clazz.getDeclaredFields();
for (Field field : fs) {
String fieldName = field.getName();//获取属性名称
sb.append(fieldName+",");
}//insert into User(userId,userName,password,
//将最后一个逗号替换成右括号insert into User(userId,userName,password)
sb.replace(sb.lastIndexOf(","),sb.lastIndexOf(",")+, ")");
sb.append(" values(");//insert into User(userId,userName,password) values(
for (Field field : fs) {
String fieldName = field.getName();//获取属性名称
//根据属性名称获取其对应的getter方法名
String getterMethodName = makeGetter(fieldName);
//根据getter方法名称获取对应的getter方法
Method getterMethod = clazz.getDeclaredMethod(getterMethodName, null);
//回调getter方法
Object value = getterMethod.invoke(obj, null);
sb.append("'"+value+"',");
}//insert into User(userId,userName,password) values('1','zhangsan','123',
//将最后一个逗号替换成右括号
sb.replace(sb.lastIndexOf(","),sb.lastIndexOf(",")+, ")");
System.out.println(sb);
}
/**
* 根据属性名称拼接其对应的getter方法:get+属性的首字母大写+其余字母
* @param fieldName:userId
* @return getUserId
*/
public static String makeGetter(String fieldName){
return "get"+fieldName.substring(,).toUpperCase()+fieldName.substring();
}
public static void main(String[] args) {
User user = new User(,"zhangsan","");
Student student = new Student("test",);
try {
// save(user);
save(student);
} catch (Exception e) {
e.printStackTrace();
}
}
}
* 解析配置文件web.xml,利用servlet-name节点中信息做键,servlet-class节点中的信息做值。
* <servlet>
<servlet-name>login</servlet-name>
<servlet-class>cn.zzsxt.reflect3.LoginServlet</servlet-class>
</servlet>
public interface Servlet {
public void service();
}
public class LogoutServlet implements Servlet {
@Override
public void service() {
System.out.println("执行用户退出功能!");
}
}
public class LoginServlet implements Servlet{
public void service(){
System.out.println("处理登陆功能!");
}
}
public class IndexServlet implements Servlet{
public void service(){
System.out.println("处理并展示首页功能!");
}
}
public static Map<String,String> parseXML(String path){
Map<String,String> map = new HashMap<String,String>();
SAXReader saxReader = new SAXReader();
try {
Document document = saxReader.read(path);
//获取根节点信息
Element webapps = document.getRootElement();
Iterator<Element> servletIter = webapps.elementIterator();
while(servletIter.hasNext()){
Element servlet = servletIter.next();
Iterator<Element> servletSubIter = servlet.elementIterator();
String servletName=null;
String servletClass=null;
while(servletSubIter.hasNext()){
Element servletSub = servletSubIter.next();
String name = servletSub.getName();
if(name.equals("servlet-name")){
servletName = servletSub.getText();//获取servlet-name节点的文本
}else if(name.equals("servlet-class")){
servletClass = servletSub.getText();//获取servlet-class节点的文本
}
//添加到map中
}
map.put(servletName, servletClass);
}
} catch (DocumentException e) {
e.printStackTrace();
}
return map;
}
public static void main(String[] args) {
Map<String,String> map = parseXML("web.xml");
System.out.println(map);
}
}
/**
* 问题:每增加一个servlet就需要添加判断,程序的扩展性比较差,违背了"开闭原则"。
*
*
*/
public class Test {
public static void main(String[] args) {
//解析配置文件:web.xml
Map<String,String> map = XMLUtils.parseXML("web.xml");
Scanner input = new Scanner(System.in);
System.out.println("请输入servlet的名称:");
String servletName = input.next();
// if("login".equals(servletName)){
// LoginServlet loginServlet = new LoginServlet();
// loginServlet.service();
// }else if("index".equals(servletName)){
// IndexServlet indexServlet = new IndexServlet();
// indexServlet.service();
// }
//根据用户输入的名称查找该Servlet的全类名
String servletClass = map.get(servletName);
//动态创建servlet对象
try {
Servlet servlet = (Servlet)Class.forName(servletClass).newInstance();
servlet.service();//多态
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
} }
}
java:反射(Hibernate的雏形)的更多相关文章
- java基础知识(十一)java反射机制(下)
1.什么是反射机制? java反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法,对于任意一个对象都能够调用他的属性和方法,这种动态获取属性和方法的功能称为java的反射机制. ...
- java反射案例
Java反射经典实例 2007-08-29 17:55:25 分类: Java Java提供了一套机制来动态执行方法和构造方法,以及数组操作等,这套机制就叫——反射.反射机制是如今很多流行框架的实现 ...
- [转]java反射机制
原文地址:http://www.cnblogs.com/jqyp/archive/2012/03/29/2423112.html 一.什么是反射机制 简单的来说,反射机制指的是程序在运 ...
- 【动态页面】(二)Java反射
Java的反射机制是Java语言非常重要的一个特性.先从Sun官网上看一下官网是怎样定义反射机制的. 大致翻译一下,翻译的可能不是非常准确. 反射(Reflection)是Java程序设计语言的一个特 ...
- Java反射举例
本文參考:http://www.cnblogs.com/yydcdut/p/3845430.html 1.Java反射的基本介绍 Java的反射很强大,传递class. 能够动态的生成该类.取得这个类 ...
- java反射机制入门01
java反射机制入门是我从极客学院的视频中学习的. 1.反射机制背景概述 反射(Reflection)是java被视为动态(或准动态)语言的一个关键性质.反射机制指的是程序在运行时能够获取任何类的内部 ...
- java反射的理解与应用(某大神博客中看到的博文,写的真的太好了,果断转载作为笔记)
原文地址:http://www.cnblogs.com/jqyp/archive/2012/03/29/2423112.html#undefined 一.什么是反射机制 简单的来说,反射机制指的是程序 ...
- Java 反射的理解
反射反射,程序员的快乐,今天你快乐了吗?如果你不快乐,没关系,接下来让你快乐起来! 一.什么是反射? 通过百度百科我们可以知道,Java反射就是在运行状态中,对于任意一个类,都能够知道这个类的所有属性 ...
- 初识Java反射
要详细的了解Java反射,就得要了解Java的类加载以及何为运行时动态加载等等概念.本文抛开其余概念,简单介绍Java反射,详细介绍会在以后有一个系统而全面的认识过后展开. 反射是Java被视为动态语 ...
随机推荐
- 设计数据结构之LRU缓存
leetcode 146. LRU Cache class LRUCache { private: struct Node { int key; int val; Node* prev; Node* ...
- string::data
const char* data() const noexcept;注:同c_str #include <iostream>#include <string>#include ...
- 使用RedisTemplate的操作类访问Redis(转载)
原文地址:http://www.cnblogs.com/luochengqiuse/p/4641256.html private ValueOperations<K, V> valueOp ...
- cmd命令行显示中文乱码
cmd命令行显示中文乱码多数是由于字符编码不匹配导致. 1.查看cmd编码方式 方法一.打开cmd,输入chcp命令回车(显示默认编码:活动代码页:936指GBK) 方法二.打开cmd在标题栏单击鼠标 ...
- Java多线程1:使用多线程的几种方式以及对比
前言 Java多线程的使用有三种方法:继承Thread类.实现Runnable接口和使用Callable和Future创建线程,本文将对这三种方法一一进行介绍. 1.继承Thread类 实现方式很简单 ...
- 我说CMMI之一:CMMI是什么--转载
我说CMMI之一:CMMI是什么 有些朋友没有接触过CMMI,正在学习CMMI,CMMI本身的描述比较抽象,所以,读起来有些费劲.有些朋友实施过CMMI,但是可能存在对CMMI的一些误解,因此我想说说 ...
- ebay API属性
Ebay Trading API整理 纠纷相关 AddDispute:创建一个未支付纠纷 或 取消 a single line item order AddDisputeResponse:回复/关闭d ...
- 【IOI2018】组合动作
还是自己水平不够,想了两天没想出来--(然后我就被其他人吊打了) 这种题目看了题解就秒会,自己想就想不出来-- 下面是我的心路历程(我就在想出来又叉掉的不断循环中度过--) 开始把题目看成了查询限制 ...
- JS框架_(JQuery.js)Tooltip弹出式按钮插件
百度云盘 传送门 密码:7eh5 弹出式按钮效果 <!DOCTYPE html> <html > <head> <meta charset="UTF ...
- python学习之路(19)
匿名函数 当我们在传入函数时,有些时候,不需要显式地定义函数,直接传入匿名函数更方便. 在Python中,对匿名函数提供了有限支持.还是以map()函数为例,计算f(x)=x2时,除了定义一个f(x) ...