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;
}
}