我的笔记 泛型和反射机制
来源:互联网 发布:我要找网络推广客户 编辑:程序博客网 时间:2024/06/04 18:56
由于类型转换的错误,java虚拟机在编译时不会报错,二在运行时报异常,所以安全隐患非常明显,为此我们需要用泛型来弥补这一问题。有了泛型,我们在集合类中添加对象的时候,就不用在强转了。
反射机制是将泛型固定的累的所有方法和成员全部可以显示出来,以供程序员可以确定程序的编写是否有无的机制
示例代码:反射机制
import java.lang.reflect.Method;
public class fanshe {
public static void main(String[] args)
{
//Bh<String> hw1=new Bh<String>("货物");
//Bh<Integer> hw2=new Bh<Integer>(123);
Bh<WJ> hw3=new Bh<WJ>(new WJ());
hw3.lxmc();
}
}
class WJ
{
public void wan()
{
System.out.println("正在玩游戏");
}
public int jiafa(int a,int b)
{
return a+b;
}
}
class Bh<L>
{
private L l;
Bh(L l)
{
this.l=l;
}
public void lxmc()
{
System.out.println("类型是"+l.getClass().getName());//取类型名称的函数
Method[] a=l.getClass().getDeclaredMethods();//用属猪来接收类中方法的数量
for(int i=0;i<a.length;i++)//逐一输出方法名称
{
System.out.println("函数名为"+a[i].getName());
}
}
}
示例代码 泛型
import java.util.*;
public class fangxing {
public static void main(String[] args) {
//Hashtable arr=new Hashtable();
ArrayList<LS> arr=new ArrayList<LS>();//如果没有<>下面的YL yl=()arr.get(0);不会报错
LS ls1=new LS("薯片",6);//同过泛型将类型定下来
arr.add(ls1);
LS ls2=(LS)arr.get(0);
//YL yl=(YL)arr.get(0);
}
}
class LS
{
private String name;
private float jiage;
LS(String name,float jiage)
{
this.name=name;
this.jiage=jiage;
}
}
class YL
{
private String name;
private float jiage;
private String yanse;
YL(String name,float jiage,String yanse)
{
this.name=name;
this.jiage=jiage;
this.yanse=yanse;
}
}
反射Reflection
nReflection 是 Java 程序开发
语言的特征之一,
它允许运行中的 Java 程序对自身
进行检查,或
者说“自审”,并能直接操作程序
的内部属性。
例如,使用它能获得 Java 类中各
成员的名称并
显示出来。<迟绑定>
nJavaBean 是 reflection 的实
际应用之一,它能
让一些工具可视化的操作软件组
件。这些工具通
过 reflection 动态的载入并取
得 Java 组件
(类) 的属性。
n
n反射机制是如今很多流行框架的
实现基础,其中
包括Spring、Hibernate(ORMapping)等
反射常用的类
n包:java.lang.reflect
nClass类:Class 类的实例表示正在运
行的 Java 应用程
序中的类和接口
nMethod:提供关于类或接口上单独某
个方法(以及如何
访问该方法)的信息
nField类:提供有关类或接口的单个字
段的信息,以及对
它的动态访问权限
nArray类:提供了动态创建和访问
Java 数组的方法
Class类主要方法
nstatic Class<?>
forName(String className)
返回与带有给定字符串名的类或接口相关联的
Class 对象
nField[] getDeclaredFields()
返回 Field 对象的一个数组,这些对象反映此
Class 对象所表示的类或接口所声明的所有字
段。
nMethod[]
getDeclaredMethods()
返回 Method 对象的一个数组,这些对象反映
此 Class 对象表示的类或接口声明的所有方
法,包括公共、保护、默认(包)访问和私有
方法,但不包括继承的方法
nBoolean
isInstance(Object obj)
判定指定的 Object 是否与此 Class 所表示的
对象赋值兼容
n Object newInstance()
创建此 Class 对象所表示的类的一个新实例
package com.eduask.reflect;
import java.lang.reflect.Method;
public class Test {
/**
* @param args
*
* 通过反射获取class的方式有三种
* 第一种方法通过 object的getClass方法
*
* 第二种方法
* 直接类.class
*
* 第三种方法
* 通过class.forName("全类名")来获取
*
* 通常我们使用第三种方法,
*
*
*
*
*
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Person p=new Person();//对象
// Class pc=p.getClass();//获取到的是Class也就是编译好的.class文件
if(p instanceof Person ){
System.out.println("p 是 person的实例");
}else{
System.out.println("p 不是 person的实例");
}
//lei1 lei 2 都是 leiBaBa 的子类 都可以用leiBaBa里面的 m1方法,但是android
// if( this instanceof lei1){
// a操作
// }
//
// Person p2=new Person();
// Class pc2=p2.getClass();
//
// System.out.println(p==p2); //false
// System.out.println(pc==pc2); //true
//
//
// Class pc3=Person.class;
// System.out.println(pc3==pc2);
try {
Class pc4=Class.forName("com.eduask.reflect.Person");
try {
Person p6=(Person) pc4.newInstance();
p6.m2();
} catch (InstantiationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
// System.out.println(pc4==pc2);
// Field[] fss=pc4.getDeclaredFields();
// int sized=fss.length;
// System.out.println("============length===>"+sized);
// for(int i=0;i<sized;i++){
// Field f=fss[i];
// System.out.println(f);
// }
Method[] ms=pc4.getDeclaredMethods();
int sized2=ms.length;
System.out.println("============length===>"+sized2);
for(int i=0;i<sized2;i++){
Method m=ms[i];
System.out.println(m);
}
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
通过反射建立JDBC创建一张表
package com.eduask.javaSE.reflectDemo;
import java.lang.reflect.Field;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
import org.junit.Test;
/**
* 实现功能:通过反射去数据库中创建相应表
* @author Administrator
*
*/
public class HbTools {
@Test
public void tester() throws ClassNotFoundException, SQLException{
String className = "com.eduask.javaSE.reflectDemo.MyStudent";
createTable(className);
}
/**
*
* @param className
* @param obj
*/
public void save(String className,Object obj){
}
/**
* create table table_name(fieldName fieldType,fieldName fieldType,...)
*
* class User{int id;String name}
*
*
*
* @param className
* @throws SQLException
* @throws ClassNotFoundException
*/
public void createTable(String className) throws ClassNotFoundException, SQLException{
//初始化sql语句
String sql = "create table ";
//为sql添加表名(com.eduask.javaSE.reflectDemo.User)Math.radom():[0,1)
String tableName = className.substring(className.lastIndexOf('.')+1);
sql += tableName;
//添加括号
sql += "(";
//为sql添加字段名跟字段类型
Class clazz = Class.forName(className);
Field[] fields = clazz.getDeclaredFields();
for (Field field : fields) {
String fieldName = field.getName();
sql += fieldName+" ";
//获取字段类型
String fieldType = field.getType().getSimpleName();
//将Java的数据类型转换为oracle数据库的数据类型
//数值类型
if("int".equals(fieldType) || "float".equals(fieldType) || "double".equals(fieldType)){
sql += "NUMBER,";
}else if("String".equals(fieldType)){//字符类型
sql += "VARCHAR2(20),";
}else if("Date".equals(fieldType)){//日期
sql += "DATE,";
}else{
System.out.println("本软件不支持的数据类型。");
}
}
//去除最后的逗号abc [0,2)
sql = sql.substring(0,sql.length()-1);
//添加括号
sql += ")";
System.out.println("sql="+sql);
//连接数据库,根据连接创建Statement,通过Statement执行sql,关闭连接
Connection conn = getConn();
Statement state = conn.createStatement();
state.execute(sql);
conn.close();
}
/**
* 获取数据库连接
* @return
* @throws ClassNotFoundException
* @throws SQLException
*/
public Connection getConn() throws ClassNotFoundException, SQLException{
Class.forName("oracle.jdbc.driver.OracleDriver");
Connection conn = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521/orcl110","scott","tiger");
return conn;
}
}
0 0
- 我的笔记 泛型和反射机制
- 学习笔记——JAVA反射<2>反射机制的效率问题和操作泛型
- 【慕课网笔记】Java 反射机制 6 通过反射了解集合泛型的本质
- java---泛型和反射机制
- 【Java反射机制】_Java反射机制的深入研究笔记
- 【Java反射机制】_Java反射机制的深入研究笔记
- 我所理解的C++反射机制
- 我所理解的C++反射机制
- 学习笔记——JAVA反射<1>反射机制的介绍和基本操作
- 反射机制和内省机制的区别
- 反射机制实现DAO的泛型
- Java泛型与反射机制---学习笔记
- Java的反射机制学习笔记
- 基础学习反射机制的学习笔记
- 我的Java反射学习笔记
- 【我的Java笔记】Java反射
- 反射机制学习笔记
- Java反射机制 笔记
- zabbix监控系统
- 树状数组——BZOJ4240 有趣的家庭菜园
- 英语词汇表
- 中文乱码在java中URLEncoder.encode方法要调用两次解决
- Jdbc的事务
- 我的笔记 泛型和反射机制
- 泛型中的? 通配符以及泛型的边界
- 用堆栈实现由十进制数向其他进制的转换
- Android recyclerview源码分析(一)
- 欢迎使用CSDN-markdown编辑器
- 联想W510电脑Ubuntu16.04下nvidia和CUDA的安装
- typedef 定义数组
- MySQL错误2003:Can't connect to MySQL server (10060)
- 搭建ftp服务器