注解反射

news/2024/7/4 13:09:22

/*    下面都很直白(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();
        }

}



去消灭过去的垃圾了。


http://www.niftyadmin.cn/n/4775253.html

相关文章

Python自学之路-requests使用总结

&#xff08;一&#xff09;背景 学习Python有三周了&#xff0c;虽然由于工作、家庭原因&#xff0c;学习的时间不够多&#xff0c;但还是尽量去争取点时间去学习&#xff0c;最近的工作中&#xff0c;如果有时间&#xff0c;有条件的话&#xff0c;都会摸索着使用Python去解…

Coder fresher 要知道底层么

其实我从前是非常一股脑赞成那种“我们必须知道底层”这种观点的。总觉得程序员知道底层才有前途&#xff0c;才好装&#xff0c;才算大佬&#xff0c;还有就是别人巴拉巴拉 操作系统编译原理计算机网络名词蹦出来&#xff0c;你什么都不会 好丢脸&#xff0c;最明显例子就是大…

Python自学之路-内置函数说明及实例(一)

这篇主要整理下Python中的内置函数说明和实际用法&#xff0c;希望对新手有帮助。「其中一部分&#xff0c;有时间会继续整理」 **1.abs() ** 对传入参数取绝对值 2.all(iterable) 说明&#xff1a;参数iterable&#xff1a;可迭代对象; 如果iterable的所有元素不为0、’’…

ssrf-lab踩坑记录

详细安装见Centos7下安装Docker&#xff08;详细安装教程&#xff09; 可以配置镜像加速器&#xff0c;在阿里云找docker节点 解决办法Linux -bash: git: 未找到命令的解决方法 呃。。不过最后还是有点问题没有解决。。 还是要转到phpstudy进行搭建 先来简单了解一下ssrf 概…

从一个集合中查找最大最小的N个元素——Python heapq 堆数据结构

Top N问题在搜索引擎、推荐系统领域应用很广&#xff0c; 如果用我们较为常见的语言&#xff0c;如C、C、Java等&#xff0c;代码量至少也得五行&#xff0c;但是用Python的话&#xff0c;只用一个函数就能搞定&#xff0c;只需引入heapq(堆队列)这个数据结构即可。今天偶然看到…

删RAC中间ASM和LISTENER 资源的正确方法

在我们的安装RAC什么时候。有时因各种错误加载错误ASM实例或LISTENER显示器&#xff0c;或增加CLUSTERWARE资源&#xff0c;但并没有真正的工作&#xff0c;例如&#xff1a; 如图所看到的&#xff0c;这里在2个节点分别创建过ASM1和ASM2实例&#xff0c;相应的资源名称分别为o…

XXE-lab(全踩坑)实录

在bWAPP中有一关是XML External Entity Attacks (XXE)传送门&#xff0c;比较简单的了解了一下XXE 师傅的博客 浅谈XML实体注入漏洞 XXE漏洞全称XML External Entity Injection即xml外部实体注入漏洞&#xff0c;XXE漏洞发生在应用程序解析XML输入时&#xff0c;没有禁止外部实…

main java.lang.ClassNotFoundException:

第一次使用注解 反射 这个沙雕代码竟然找不到类&#xff01; Class tableClass.forName("Subject");//1.使用类加载器加载类对象 报错 然后我加上包名.类名就好了可是我代码里包是导入了。。。 Class tableClass.forName("entity.Subject");//1.使用类加载…