* 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的雏形)的更多相关文章

  1. java基础知识(十一)java反射机制(下)

    1.什么是反射机制? java反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法,对于任意一个对象都能够调用他的属性和方法,这种动态获取属性和方法的功能称为java的反射机制. ...

  2. java反射案例

     Java反射经典实例 2007-08-29 17:55:25 分类: Java Java提供了一套机制来动态执行方法和构造方法,以及数组操作等,这套机制就叫——反射.反射机制是如今很多流行框架的实现 ...

  3. [转]java反射机制

    原文地址:http://www.cnblogs.com/jqyp/archive/2012/03/29/2423112.html 一.什么是反射机制         简单的来说,反射机制指的是程序在运 ...

  4. 【动态页面】(二)Java反射

    Java的反射机制是Java语言非常重要的一个特性.先从Sun官网上看一下官网是怎样定义反射机制的. 大致翻译一下,翻译的可能不是非常准确. 反射(Reflection)是Java程序设计语言的一个特 ...

  5. Java反射举例

    本文參考:http://www.cnblogs.com/yydcdut/p/3845430.html 1.Java反射的基本介绍 Java的反射很强大,传递class. 能够动态的生成该类.取得这个类 ...

  6. java反射机制入门01

    java反射机制入门是我从极客学院的视频中学习的. 1.反射机制背景概述 反射(Reflection)是java被视为动态(或准动态)语言的一个关键性质.反射机制指的是程序在运行时能够获取任何类的内部 ...

  7. java反射的理解与应用(某大神博客中看到的博文,写的真的太好了,果断转载作为笔记)

    原文地址:http://www.cnblogs.com/jqyp/archive/2012/03/29/2423112.html#undefined 一.什么是反射机制 简单的来说,反射机制指的是程序 ...

  8. Java 反射的理解

    反射反射,程序员的快乐,今天你快乐了吗?如果你不快乐,没关系,接下来让你快乐起来! 一.什么是反射? 通过百度百科我们可以知道,Java反射就是在运行状态中,对于任意一个类,都能够知道这个类的所有属性 ...

  9. 初识Java反射

    要详细的了解Java反射,就得要了解Java的类加载以及何为运行时动态加载等等概念.本文抛开其余概念,简单介绍Java反射,详细介绍会在以后有一个系统而全面的认识过后展开. 反射是Java被视为动态语 ...

随机推荐

  1. oracle的监听控制

    来自网络: listener control 监听控制 因为你在键入 lsnrctl 回车之后,就进入到监听控制界面. 在启动.关闭或者重启oracle监听器之前确保使用lsnrctl status命 ...

  2. 2019全国卷(III)理科23题的另类解法

    已知 $x,y,z\in\textbf{R}$且$x+y+z=1$ (1)求$(x-1)^2+(y+1)^2+(z+1)^2$的最小值: (2)若$(x-2)^2+(y-1)^2+(z-a)^2\ge ...

  3. MyEclipse使用教程:添加和更新插件(一)

    [MyEclipse CI 2019.4.0安装包下载] 通过Eclipse Marketplace目录或各种更新站点类型添加插件来自定义您的Genuitec IDE. Genuitec提供以下IDE ...

  4. 提取全局应用程序集中的dll

    如何提取全局应用程序集中的dll GAC路径:C:\WINDOWS\assembly 在资源管理器中打开这个路径看到的东西不能复制,右键中也只有 “卸载” 和 “属性” 两个菜单. 在命令提示符下切换 ...

  5. dockerfile:python-cuda-nvidia-cudnn

    centos7 FROM centos:7 MAINTAINER yon@DataExa.com RUN yum -y install make wget \ && wget -O / ...

  6. hdu 1208 Ignatius and the Princess III 划分数,dp

    题目 题意:给你一个数字n,求将其划分成若干个数字相加总共有多少种划分数: <span style="font-size:24px;">#include <ios ...

  7. HGOI20190811 省常中互测4

    Problem A magic 给出一个字符串$S$,和数字$n$,要求构造长度为$n$只含有小写字母的字符串$T$, 使得在$T$中存在删除且仅删除一个子串使得$S=T$成立. 输出$T$的构造方案 ...

  8. CodeForces 1245D Shichikuji and Power Grid

    cf题面 解题思路 比赛过程中想了一个贪心--把所有城市按照自建代价排序,排在第一的城市肯定自建,之后依次判断排在后面的城市要自建还是要连接前面的.这么做WA13了(第一次忘开long longWA4 ...

  9. 【UOJ#129】 【NOI2015】寿司晚宴

    题目描述 为了庆祝 NOI 的成功开幕,主办方为大家准备了一场寿司晚宴.小 G 和小 W 作为参加 NOI 的选手,也被邀请参加了寿司晚宴. 在晚宴上,主办方为大家提供了 n−1 种不同的寿司,编号 ...

  10. matplotlib绘图时显示额外的“figure”浮窗

    引自 https://blog.csdn.net/weixin_41571493/article/details/82690052 问题:现在默认的Pycharm绘图时,都会出现下面的情况: 不能弹出 ...