/* 下面都很直白(low 不专业) 用最简单的东西描述完注解反射
如有错 你们去找我java老师算账吧 是他教的问题 就是这样。
知道或者了解一下注解 反射还是很有助于java框架学习的(我觉得是的)。注解反射应用上是框架 ,底层原理下是编译器 设计者的阴影 这里稍微提一丢丢反射底层。越学习底层越不想学 因为都活在别人阴影里 有什么意思呢*/
其实在Java基础部分这两个东西出现过的但是基本被大家忽略。。比如@Override 大家是不是直接无视。。。。
直到你们得开始学框架了诸如ssm这种框架,里面类似@controller 注解满天飞。那关反射什么事情呢。此处我应该举个框架例子说明反射。但是不想写。我框架也没有怎么学。。。。
框架就是基于反射的Java 然后充满了注解的东西。Bingo。
反射是什么呢。
反射是Java的一个类。有很多相关方法。一般是在java.lang.reflect下有很多相关方法。
反射有什么用呢?(我这里说直接的作用 不引申 不扩散)
反射可以在程序运行时通过反射方法 以及Class类 就得到你想得到的类的公有方法 属性名 构造器 还可以使用类的方法 构造实例。
简而言之:就是通过反射 你差不多可以知道一个类所有信息 还可以使用它的方法。
反射原理是什么呢?
每个类被加载到jvm时 在Java堆中生成一个代表这个类的java.lang.Class对象,作为方法区这些数据的访问入口。所以java反射机制里通过 Class对象获取类的所有信息。
注解是什么呢(我这里的 是什么 作用 都是站在人的角度 就是程序员的角度 你们想理解就理解吧不想就pass)
注解就是一个标记 可以限定标记内容比如对你想标记的类进行标记 比如整个类 或者这个类的某个字段 还可以限定标记时间如运行时 编译阶段
注解有什么用呢?
注解可以得到那个类里你标记好的内容。
(注解我可能说得太抽象了。。。)
下面就是代码。。。。
主要是给我自己以后瞅瞅 注解是怎么用的。。。主要涉及类 ,字段的注解以及反射。包名类名都很不Java。。。。
/*
*主要有个实体类 然后两个注解 一个测试类 比较沙雕。。。
/
package annotation;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
* author:Lord
* 这是注解类 主要是用于存放学生表表名
*/
@Target(ElementType.TYPE) //作用于类
@Retention(RetentionPolicy.RUNTIME)//运行时有效
public @interface Table {
String value();
}
-------------------------------------------------------------------------------------
package annotation;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
*
* @author Lord
* 主要用于存放数据库字段名字 同时也是实体类类属性名字
*/
//声明一个注解
@Target(ElementType.FIELD) //作用于字段
@Retention(RetentionPolicy.RUNTIME)//运行时有效
public @interface Key {
String value ();
}
--------------------------------------------------------------------------
package entity;
import annotation.Key;
import annotation.Table;
/**
*
*
* @author Lord
* 这是实体类 也就是我们注解的作用对象
*/
@Table("Subject")
public class Subject {
@Key("name")
private String name;
@Key("teacher")
private String teacher;
@Key("like")
private String like;
public Subject()
{
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getTeacher() {
return teacher;
}
public void setTeacher(String teacher) {
this.teacher = teacher;
}
public String isLike() {
return like;
}
public void setLike(String like) {
this.like = like;
}
@Override
public String toString()
{
return name+teacher+like;
}
}
--------------------------------------------------------------------------------
package jdbc;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.lang.annotation.Annotation;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.lang.reflect.ParameterizedType;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.sql.Types;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.ResourceBundle;
import java.sql.ResultSetMetaData;
import java.sql.PreparedStatement;
import entity.Subject;
import annotation.Table;
import annotation.Key;
public class Dao {
// jdbc连接巴拉巴拉
private static String dbUrl="jdbc:mysql://localhost:3306/subject";//好像这个和下面的区别是 mysql版本 多少之前是上面 多少是下面的。。。
private static String dbUrl1="jdbc:mysql://localhost:3306/subject?characterEncoding=utf8&useSSL=false";
//用户名
private static String dbUserName="root";
//密码
private static String dbPassword="LrmsJjp73z3jYwg2";
// 驱动名称
private static String jdbcName = "com.mysql.jdbc.Driver";
Connection con = null;
public void link() throws ClassNotFoundException
{
Class.forName(jdbcName);
System.out.println("加载驱动成功!");
try {
//获取数据库连接
con = DriverManager.getConnection(dbUrl1, dbUserName, dbPassword);
System.out.println("获取数据库连接成功!");
System.out.println("进行数据库操作!");
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
System.out.println("获取数据库连接失败!");
}
}
public void search() throws ClassNotFoundException, InstantiationException, IllegalAccessException, SQLException
{
/*------------ 通过注解反射获得 字段名和实体类表名------------------------*/
Class table=Class.forName("entity.Subject");//1.使用类加载器加载类对象
boolean is=table.isAnnotationPresent(Table.class);//判断Subject这个类是否应用了Table这个注解
HashMap h=new HashMap();
Table t = null;
if(is)//如果应用了则获取注解内容
{
t=(Table)table.getAnnotation(Table.class);
System.out.println(t.value());
}
Field[] ans = table.getDeclaredFields();//获取所有注解在该类上的字段注解
for(Field f:ans)
{
Key k=f.getAnnotation(Key.class);
if(k!=null)
{
f.setAccessible(true);
System.out.println(f.getName());
}
}
/*---------------------------获取数据库内容------------------------------*/
PreparedStatement pst = null;
ResultSet rs = null;
String sql="select * from "+t.value();
pst = con.prepareStatement(sql);
rs = pst.executeQuery();
List <Subject> list=new ArrayList();
/********************存放实例化以后的实体类*************************/
while(rs.next())
{
Subject s=Subject.class.newInstance();
s.setLike(rs.getString("name"));
s.setName(rs.getString("teacher"));
s.setTeacher(rs.getString("like"));
list.add(s);
}
for(Subject t2:list)
{
System.out.println(t2);
}
}
}
--------------------------------------------------------------------------------
package test;
import java.sql.SQLException;
import jdbc.Dao;
public class Test {
public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException, SQLException {
// TODO Auto-generated method stub
/*--------------------- 数据库连接 -----------------------*/
Dao link=new Dao();
link.link();
/*---------------------数据库查询 拼凑sql语句------------------------------- */
link.search();
}
}
去消灭过去的垃圾了。