/*
* Copyright (C) 2015
* heaven7(donshine723@gmail.com)
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.heaven7.scrap.util;
import java.lang.reflect.Array;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
/**
* reflect util
* @author heaven7
*/
public class Reflector{
public static IReflector from(Class<?> clazz){
return new SimpleReflector(clazz);
}
public interface IReflector {
/**equal to Class.newInstance() */
public abstract <T>T newInstance();
public abstract IReflector constructor(Class<?>... paramTypes);
/** create an Instance of T, you must call the method {@linkplain #constructor} first*/
public abstract <T> T create(Object... args);
/** find the field */
public abstract IReflector field(String name);
/** find the method */
public abstract IReflector method(String name, Class<?>... paramTypes);
/** set static field value */
public abstract IReflector setStatic(Object value);
/** set static field value */
public abstract IReflector set(Object target, Object value);
/** get field value*/
public abstract <T> T get(Object target);
/** get static field value*/
public abstract <T> T getStatic();
/** invoke static method */
public abstract <T> T invokeStatic(Object... args);
/** invoke method */
public abstract <T> T invoke(Object target, Object... args);
}
/*public static void getUniqueName(StringBuilder sb,Object...objs){
final Class<?> clazz = objs.getClass();
sb.setLength(0);
sb.append(clazz.getName());
Class<?> clazz2 = clazz;
while(clazz2.isArray()){
clazz2 = clazz2.getComponentType();
sb.append(clazz2.getName());
}
}*/
public static Class<?> toArrayType(Class<?> clazz) {
return Array.newInstance(clazz, 0).getClass();
}
@SuppressWarnings("unchecked")
public static<T>T[] newArray(Class<T> clazz,int len) {
return (T[]) Array.newInstance(clazz, len);
}
@SuppressWarnings("unchecked")
public static <T> Constructor<T> constructor(Class<?> clazz,Class<?>...paramTypes){
try {
Constructor<?> c = clazz.getDeclaredConstructor(paramTypes);
c.setAccessible(true);
return (Constructor<T>) c;
} catch (NoSuchMethodException e) {
throw new RuntimeException(e);
}
}
public static Method method(Class<?> clazz,String name,Class<?>...paramTypes){
try {
Method m = clazz.getDeclaredMethod(name, paramTypes);
m.setAccessible(true);
return m;
} catch (NoSuchMethodException e) {
throw new RuntimeException(e);
}
}
public static Field field(Class<?> clazz,String name){
try {
Field f = clazz.getDeclaredField(name);
f.setAccessible(true);
return f;
} catch (NoSuchFieldException e) {
throw new RuntimeException(e);
}
}
private static class SimpleReflector implements IReflector{
private final Class<?> clazz;
private Method m;
private Field f;
private Constructor<?> c;
public SimpleReflector(Class<?> clazz) {
this.clazz = clazz;
}
@Override
@SuppressWarnings("unchecked")
public <T>T create(Object...args){
try {
return (T) c.newInstance(args);
} catch (Exception e) {
throw new RuntimeException(e);
}
}
@Override
public IReflector constructor(Class<?>...paramTypes){
this.c = Reflector.constructor(clazz,paramTypes);
return this;
}
/* (non-Javadoc)
* @see com.heaven.classloadertest.IReflector#field(java.lang.String)
*/
@Override
public IReflector field(String name){
this.f = Reflector.field(clazz, name);
return this;
}
/* (non-Javadoc)
* @see com.heaven.classloadertest.IReflector#method(java.lang.String, java.lang.Class)
*/
@Override
public IReflector method(String name,Class<?>...paramTypes){
this.m = Reflector.method(clazz, name, paramTypes);
return this;
}
/* (non-Javadoc)
* @see com.heaven.classloadertest.IReflector#setStatic(java.lang.Object)
*/
@Override
public IReflector setStatic(Object value){
return set(null, value);
}
/* (non-Javadoc)
* @see com.heaven.classloadertest.IReflector#set(java.lang.Object, java.lang.Object)
*/
@Override
public IReflector set(Object target,Object value){
try {
f.set(target, value);
return this;
} catch (Exception e) {
throw new RuntimeException(e);
}
}
/* (non-Javadoc)
* @see com.heaven.classloadertest.IReflector#get(java.lang.Object)
*/
@Override
@SuppressWarnings("unchecked")
public <T> T get(Object target){
try {
return (T) f.get(target);
} catch (Exception e) {
throw new RuntimeException(e);
}
}
/* (non-Javadoc)
* @see com.heaven.classloadertest.IReflector#getStatic()
*/
@Override
public <T> T getStatic(){
return get(null);
}
/* (non-Javadoc)
* @see com.heaven.classloadertest.IReflector#invokeStatic(java.lang.Object)
*/
@Override
public <T> T invokeStatic(Object...args){
return invoke(null, args);
}
/* (non-Javadoc)
* @see com.heaven.classloadertest.IReflector#invoke(java.lang.Object, java.lang.Object)
*/
@Override
@SuppressWarnings("unchecked")
public <T> T invoke(Object target,Object...args){
try {
return (T) m.invoke(target, args);
} catch (Exception e) {
throw new RuntimeException(e);
}
}
@SuppressWarnings("unchecked")
@Override
public <T> T newInstance() {
try {
return (T) clazz.newInstance();
} catch (Exception e) {
throw new RuntimeException(e);
}
}
}
}