反射one之code

页面一
package com.oracle.reflect;

public class Person {
	//属性 
	public String pname;
	private Integer age;
	private String password;
	
	public Person(){
		
	}
	
	public Person(Integer age){
		this.age = age;
	}
	
	public Person(String name,String password){
		this.pname =name;
		this.password = password;
	}
	
	public String getPname() {
		return pname;
	}
	public void setPname(String pname) {
		this.pname = pname;
	}
	public int getAge() {
		return age;
	}
	public void setAge(Integer age) {
		this.age = age;
	}
	public String getPassword() {
		return password;
	}
	public void setPassword(String password) {
		this.password = password;
	}
	//方法  无返回值 无参数
	public void eat1(){
		System.out.println("吃好吃的");
	}
	// 无返回值 有参数
	public void buy(int money){
		System.out.println(money + "元的水");
	}
	// 有返回值  无参数
	public int a(){
		return 1+1;
	}
	// 有返回值 有参数
	public void test(String name,String password){
		System.out.println("我是test2");
		System.out.println("姓名为:"+name + " \n密码为:"+password );
	}
	
	public void test1(String n ,String p){
		System.out.println("我是test1");
	}
	
}
页面二
package com.oracle.reflect;

import java.lang.reflect.Field;

public class Demo  {
 
	public static void main(String[] args) throws Exception {
		
		//获取Person类的结构

		//第一种方式
		//Class c = Class.forName("com.oracle.reflect.Person");
		
		//第二种方式 获取 反射Class的类
	    Class c = Person.class;//最常用的
		
		//第三种
		//Person p =new Person();
		//Class c = p.getClass();//一般情况下不用
		
		//获取类名
		String simpleName = c.getSimpleName();
		System.out.println("类名为: "+simpleName);
		
		//获取类的 公有属性
		Field[] fields = c.getFields();
		for (Field field : fields) {
			System.out.println(field.getName());//只可以获取公有属性
		}
		System.out.println("=============================");
		//获取类的所有属性
		Field[] df = c.getDeclaredFields();
		for (Field field : df) {
			System.out.println(field.getName());//获取所有属性
		}
		
		
		
	}
	
}
页面三
package com.oracle.reflect;

import java.lang.reflect.Constructor;

public class TestConstructor {
	
	public static void main(String[] args) throws Exception, SecurityException {
		
		Person p = new Person();
		Class c = p.getClass();
		
		Constructor con = c.getConstructor(Integer.class);//获取指定参数的构造器
		
		Person person =(Person) con.newInstance(45);
		System.out.println("年龄为:"+person.getAge());
		
		Constructor[] constr = c.getConstructors();//获取 Person类中所有的构造器
		
		for (Constructor constructor : constr) {
			
			//System.out.println(constructor.getName());
			//System.out.println(constructor.getParameterCount());
			
			Class[] cc = constructor.getParameterTypes();
			for (Class r : cc) {
				System.out.println(r.getSimpleName());
			}
			
			
		}
		
	}
}
页面四
package com.oracle.reflect;
//反射包
import java.lang.reflect.Field;

public class TestField {
	 
	
	public static void main(String[] args) {
		
		try {
		//Class类 获取反射对象的 类
		Class c = Class.forName("com.oracle.util.DBTools");
	
		//常用的方法
		String name = c.getName(); //获取当前类的全限定名
		System.out.println("类的全限定名: "+name);
			
		String simpleName = c.getSimpleName(); //获取 当前类的 简单的名字
		System.out.println("简单类名: "+simpleName);
			
		Field[] f = c.getDeclaredFields(); //获取 当前类中 所有的属性
		//是数组需要循环  来 封装了 拼接的sql 语句
		for (Field field : f) {
			String fName = field.getName();
			System.out.println(fName);
			Class clazz = field.getType();
			System.out.println("当前属性的类型是 : "+clazz.getName());
			System.out.println("当前属性的简单类型 :"+clazz.getSimpleName());
			int modifiers = field.getModifiers();
			System.out.println("修饰符: " + modifiers);
		}
		
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}
class TestFieldTwo{
	
	
	
	public static void main(String[] args) throws Exception, SecurityException {
		
		
		Class clazz = Person.class;
		
		//获取 指定 属性
		Field f = clazz.getField("pname");//获取 指定名字的 属性方法
		
		String name = f.getName();
		System.out.println("属性的名: "+f.getName());
		
		Class<?> type = f.getType();
		System.out.println("属性的类型为: "+type.getSimpleName());
		Person p = new Person();
	
		f.set(p, "李四");//赋值
		
		Object obj = f.get(p);
		System.out.println("属性的值为:"+ obj);
		
		f.set(p, "张三");//赋值
		
		Object newObj = f.get(p);
		System.out.println("重新赋值后的属性的值为:"+ newObj);
		
		
		
	}
	
}
页面五
package com.oracle.reflect;

import java.lang.reflect.Method;

/**
 * 通过反射 来获取 类中的方法
 * @author Administrator
 */
public class TestMethod {

	
	public static void main(String[] args) throws Exception, SecurityException {
		
		//反射
		Class c = Person.class;
		
		Method a = c.getMethod("test", String.class,String.class);//获取指定方法
		
		String name = a.getName();
		System.out.println(name);
		
		Class<?> returnType = a.getReturnType();
		
		System.out.println(returnType.getSimpleName());
		
		int parameterCount = a.getParameterCount();
		System.out.println(name+"方法的 参数个数为: "+ parameterCount);
		
		//我现在想调用 Person类中的 test方法
		//我在没有创建 person 对象后 调用方法的情况下
		//通过反射的 Method类中的 invoke方法 执行了指定方法
		Object obj = a.invoke(new Person(), "张三","123");
		System.out.println(obj);
		
		
		/*Method[] m = c.getDeclaredMethods(); //获取 Person类中所有的方法
		for (Method method : m) {
			
			System.out.println("方法的返回值为: "+ method.getName());
			
			System.out.println("返回值类型为:"+method.getReturnType().getName());
	
			System.out.println("方法参数的个数为: "+method.getParameterCount());
		
			System.out.println("方法的修饰符为: " +method.getModifiers());//没有用
			
			Class[] clazz = method.getParameterTypes();
			
			for (Class cc: clazz) {
				System.out.println("方法参数的类型为:"+cc.getSimpleName());
			}
		}*/
		
		
		
		/*
		 * boolean flag = false;
		 * for (Method method : m) {
			if(method.getName().equals("eat")){
				flag = true;
			}
		}
		
		String str = flag ? "有" : "沒有";
 		System.out.println(str);*/
		
	}

	
	
}
页面六
package com.oracle.util;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

/**
 * 
 * DBTools: database 数据库 工具类 
 * 
 * @author Administrator
 * 
 * 理解封装的好处
 * 
 */
public class DBTools{
	//将 三个参数 提取出去 作为全局 静态 常量  变量
	private static final String URL = "jdbc:mysql://localhost:3306/java18?characterEncoding=utf8&useSSL=false&serverTimezone=UTC";
	private static final String USERNAME = "root";
	private static final String PASSWORD = "zhihua678";

	private static Connection conn;
	private static PreparedStatement ps;
	
	
	//java 中 静态块儿 只执行一次

	static{ 
		try {
			//类 加载时 只运行 一次  就是 反射
			Class.forName("com.mysql.jdbc.Driver");
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	
	//最终的目的就是 获取 Connection  设计 个方法 来 获取 连接 
	
	//封装 通过这个 方法 获取 Connection 对象
	public static Connection getConnection(){
		conn = null;//初始化一个 Connection
		try {
		conn = DriverManager.getConnection(URL, USERNAME, PASSWORD);
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return conn;
	}
	
	
	/**
	 * 万能方法: 
	 * 
	 * 封装 : 增  删  改 的万能方法 
	 * 
	 * 入参:  形参 String sql
	 */
	public static boolean executeUpdate(String sql,Object...objs){
		//获取连接
		conn = DBTools.getConnection();
		int result = 0;
		try {
		ps = conn.prepareStatement(sql);
		//给 ? 赋值 没写
		for (int i = 0; i < objs.length; i++) {
			ps.setObject(i+1,objs[i]);
		}
		//发送 并执行sql语句
		result = ps.executeUpdate();
		
		} catch (Exception e) {
			e.printStackTrace();
		}finally {
			
			DBTools.close(conn, ps, null);
		}
		
		return result > 0 ? true : false;
	}

	//资源的关闭    关闭 资源 不需要 返回值
	// 关闭 什么呢 ? Connection , Statement , ResultSet 所以 要当作 入参传入进来
	public static void close(Connection conn,PreparedStatement ps,ResultSet rs){
		//在方法入参 的地方  定义 形参 ,
			try {
				if(null != rs){ // 这样写 不会出现 空指针异常 
				  rs.close();
				}
				if(null != ps){
				 ps.close();	
				}
				if(null != conn){
					conn.close();
				}
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
}

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值