Я создал эту прокси-оболочку для обработки вызовов методов. Кажется, работает, мне просто интересно, если кто-нибудь может проверить и сказать мне, если что-то можно улучшить и почему?
Ура!
stackover жалуется, мне нужно написать больше, так что это просто наполнители ... LOL
ИГНОРИРУЙТЕ
Видео предоставляет мощный способ помочь вам доказать свою точку зрения. Когда вы нажимаете Online Video, вы можете вставить код для встраивания видео, которое хотите добавить. Вы также можете ввести ключевое слово для поиска в Интернете видео, которое лучше всего подходит для вашего документа.
Чтобы ваш документ выглядел профессионально, Word предлагает дизайн верхнего и нижнего колонтитула, титульного листа и текстового поля, которые дополняют друг друга. Например, вы можете добавить соответствующую титульную страницу, заголовок и боковую панель. Нажмите «Вставить», а затем выберите нужные элементы из разных галерей.
Темы и стили также помогают поддерживать согласованность вашего документа. Когда вы нажимаете «Дизайн» и выбираете новую тему, изображения, диаграммы и графика SmartArt изменяются в соответствии с вашей новой темой. Когда вы применяете стили, ваши заголовки меняются в соответствии с новой темой.
Экономьте время в Word с помощью новых кнопок, которые отображаются там, где они вам нужны. Чтобы изменить способ размещения изображения в документе, щелкните его, и рядом с ним появится кнопка с параметрами макета. Когда вы работаете с таблицей, щелкните там, где вы хотите добавить строку или столбец, а затем нажмите знак «плюс».
В новом представлении «Чтение» тоже легче читать. Вы можете свернуть части документа и сфокусироваться на нужном тексте. Если вам нужно прекратить чтение до того, как вы достигнете конца, Word запомнит, где вы остановились - даже на другом устройстве.
ОК, ЗДЕСЬ КОД
import java.lang.reflect.Method;
public class ProxyWrapper
{
Class<?> c = null;
Object o = null;
String namespace = null;
String className = null;
Thread tCleanup;
HouseKeeping houseKeeping = null;
Boolean closing = false;
long idle_start = System.currentTimeMillis();
int timeout = 10000;
public ProxyWrapper()
{
CreateHouseKeeping();
}
public ProxyWrapper(String namespace, String className) throws ClassNotFoundException, InstantiationException, IllegalAccessException, Exception
{
msg("new ProxyWrapper");
this.namespace = namespace;
this.className = className;
msg("calling INIT");
INIT();
CreateHouseKeeping();
}
private void CreateHouseKeeping()
{
msg("creating housekeeping");
houseKeeping = new HouseKeeping();
houseKeeping.SetParent(this);
tCleanup = new Thread(houseKeeping);
tCleanup.start();
}
public void msg(Object e)
{
if(e.getClass() == String.class)
{
System.out.println((String)e);
}
if(e.getClass() == Exception.class)
{
System.out.println(((Exception)e).toString());
}
}
public int GetTimeout()
{
return timeout;
}
public long GetIdleTime()
{
return idle_start;
}
public void SetIdleTime(long value)
{
idle_start = value;
}
public Boolean GetClosing()
{
return closing;
}
public void SetClosing(Boolean value)
{
closing = value;
}
private void INIT()throws ClassNotFoundException, InstantiationException, IllegalAccessException, Exception
{
if(namespace == null || namespace.length()==0)
throw new Exception("Namespace property not set");
if(className == null || className.length()==0)
throw new Exception("Classname property not set");
c = Class.forName(namespace+"."+className);
o= c.newInstance();
}
private class HouseKeeping implements Runnable
{
ProxyWrapper parent = null;
public HouseKeeping()
{
}
public void SetParent(ProxyWrapper parent)
{
this.parent = parent;
}
@Override
public void run()
{
long t = 0;
while (!parent.GetClosing())
{
try
{
t = (System.currentTimeMillis() - parent.GetIdleTime());
msg("Housekeeping, checking idle session: " + t);
Thread.sleep(200);
if( t > parent.GetTimeout() )
{
msg("Session idle expired, finilizing");
parent.SetIdleTime(System.currentTimeMillis());
parent.finalize();
//break;
}
}
catch (Throwable e)
{
msg(e);
}
}
}
}
public Object Invoke(String method, Object[] args) throws Exception
{
//Method m = null;
Method[] methods = null;
try
{
if(method==null ||method.length()==0)
throw new Exception("Method name is null/empty");
msg("Invoking method " + method);
if(o==null)
INIT();
SetIdleTime(System.currentTimeMillis());
//m = o.getClass().getMethod(method);
methods = c.getMethods();
for (Method m : methods) {
msg(m.getName());
if (method.equals(m.getName())) {
return m.invoke(null, args);
}
}
throw new ClassNotFoundException("Method not found " + method);
}
finally
{
methods = null;
}
}
@Override
public void finalize() throws Throwable
{
try
{
msg("entering finalize");
closing = true;
c = null;
o = null;
}
catch(Throwable t)
{
msg(t);
throw t;
}
finally
{
msg("leaving finalize");
super.finalize();
}
}
}