我的笔记 泛型和反射机制

来源:互联网 发布:我要找网络推广客户 编辑:程序博客网 时间: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
nClassClass 类的实例表示正在运
行的 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
原创粉丝点击