Person
package com.yuankai;
public class Person {
@Override
public String toString() {
// TODO Auto-generated method stub
return getName()+getAge();
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
private String name;
private int age;
//加载class文件时执行
// static {
// System.out.println("class load");
// }
//
public Person(String name, int age) {
// System.out.println("construct 2");
this.age = age;
this.name = name;
}
public Person() {
// System.out.println("construct method");
}
//实例化对象时执行,比构造方法早执行
// {
// System.out.println("blank ");
// }
}
测试例子
package com.yuankai;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
public class ReflectDemo {
public static void main(String[] args) throws Exception {
// demo1();
// demo2();
// demo3();
// demo4();
// demo5();
// demo6();
}
public static void demo1() {
Person p = new Person();
if(p.getClass().getPackage() == null) {
System.out.println("package is null");
} else {
System.out.println(p.getClass().getPackage().getName());
}
System.out.println(p.getClass().getName());
}
public static void demo2() throws ClassNotFoundException {
Class class1 = null;
Class<?> class2 = null;
//Class.forName 类加载器会把对应的Class文件加载进来
class1 = Class.forName("com.yuankai.Person");
//Person.class 类加载器不会把Person对应的Class加载进来
class2 = Person.class;
}
public static void demo3() throws InstantiationException, IllegalAccessException, ClassNotFoundException {
Person p = (Person) Class.forName("com.yuankai.Person").newInstance();
p.setAge(10);
p.setName("test");
System.out.println(p.toString());
}
public static void demo4() throws InstantiationException, IllegalAccessException, ClassNotFoundException, IllegalArgumentException, InvocationTargetException {
Class<?> class1 = null;
class1 = Class.forName("com.yuankai.Person");
//注意class的构造方法的顺序
//构造方法定义的顺序与cons的下标值一致
Constructor<?>[] cons = class1.getConstructors();
for(int i=0; i<cons.length; i++) {
System.out.println(cons[i].toString());
}
Person p = (Person) cons[0].newInstance("yuankai", 32);
Person p1 = (Person) cons[1].newInstance();
System.out.println(p.toString());
System.out.println(p1.toString());
}
public static void demo5() throws Exception {
Class<?> class1 = Class.forName("com.yuankai.Person");
//newInstance只会调用无参数的构造方法
Object obj = class1.newInstance();
Field f = class1.getDeclaredField("name");
f.setAccessible(true);
f.set(obj, "this name");
System.out.println("alter the feature :" + f.get(obj));
}
public static void demo6() throws Exception {
//AppClassLoader 加载classpath指定的类,是最常用的加载器。同时也是java中默认的加载器
String classLoaderName = Person.class.getClassLoader().getClass().getName();
System.out.println(classLoaderName);
}
public static void demo7() throws Exception {
//这个是测试Class文件什么情况下加载的
Class<?> c = Person.class;
System.out.println("======");
Class.forName("com.yuankai.Person");
}
}
反射机制应用于工厂模式:
package Reflect;
import java.io.*;
import java.util.*;
interface fruit{
public abstract void eat();
}
class Apple implements fruit{
public void eat(){
System.out.println("Apple");
}
}
class Orange implements fruit{
public void eat(){
System.out.println("Orange");
}
}
//操作属性文件类
class init{
public static Properties getPro() throws FileNotFoundException, IOException{
Properties pro=new Properties();
File f=new File("fruit.properties");
if(f.exists()){
pro.load(new FileInputStream(f));
}else{
pro.setProperty("apple", "Reflect.Apple");
pro.setProperty("orange", "Reflect.Orange");
pro.store(new FileOutputStream(f), "FRUIT CLASS");
}
return pro;
}
}
class Factory{
public static fruit getInstance(String ClassName){
fruit f=null;
try{
f=(fruit)Class.forName(ClassName).newInstance();
}catch (Exception e) {
e.printStackTrace();
}
return f;
}
}
class hello{
public static void main(String[] a) throws FileNotFoundException, IOException{
Properties pro=init.getPro();
fruit f=Factory.getInstance(pro.getProperty("apple"));
if(f!=null){
f.eat();
}
}
}
反射 模拟hibernate中Session的save方法
package com.yuankai;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.util.HashMap;
import java.util.Map;
public class Session {
private String tableName = "_Person";
private Map<String, String> sfs = new HashMap<>();
private String []methodName = null;
public Session() {
sfs.put("_id", "id");
sfs.put("_name", "name");
sfs.put("_age", "age");
methodName = new String[sfs.size()];
}
public void save(Person p) throws Exception {
String sql = createSql();
//数据库相关操作
for(String name : methodName) {
Method m = Person.class.getMethod(name);
Class r = m.getReturnType();
System.out.println(m.getName()+"!" + r.getName());
if(r.getName().equals("java.lang.String")) {
String returnValue = (String) m.invoke(p);
}
}
}
public String createSql() throws Exception {
Session s = new Session();
StringBuilder str2 = new StringBuilder();
int index = 0;
for(int i=0; i<sfs.size(); i++) {
str2.append("?,");
}
String str1 = "";
for(String s1 : sfs.keySet()) {
String v = sfs.get(s1);
v = Character.toUpperCase(v.charAt(0)) + v.substring(1);
methodName[index] = "get"+v;
index++;
str1 += s1+",";
}
str1 = str1.substring(0, str1.length()-1);
//这个要注意index值得问题,下标应该从0开始
str2.deleteCharAt(str2.length()-1);
System.out.println(str2.toString());
System.out.println(str1);
String sql = "insert into " + tableName +"(" +str1 +") values(" + str2 +")";
System.out.println(sql);
for(int i=0; i<methodName.length; i++) {
System.out.println(methodName[i]);
}
return sql;
}
}