Главная
>>
Каталог задач
>>
Разное
>>
Рефлексия (reflection)
>>
Доступ ко всем полям и методам
Aвтор:
this
Дата:
26.11.2006
Просмотров: 59038
реализации(java: 1шт...)
+добавить
Не каждый язык может похвастаться столь сомнительными особенностями. Но одни из самых известных в настоящее время языков программирования вполне предоставляют такую возможность.
Дело в том, что обход таких коренных ограничений полезен при написании разного рода системных средств, дебагеров и т.д.
Задача следующая: предоставить код, который получает доступ ко всем private, protected полям и методам любого другого объекта, не являющегося родителем первого конечно.
В большинстве случаев это делается с помощью механизма/средств рефлекции(reflection).
Реализации:
java(1)
+добавить
1)
Доступ ко всем полям и методам произвольного класса через рефлекцию reflection на java, code #188[автор:-]
// Secret.java
public class Secret {
private String secretCode =
"It's a secret";
private String getSecretCode
(){ return secretCode;
}
}
// Hacker.java
import java.
lang.
reflect.
Field;
import java.
lang.
reflect.
Method;
public class Hacker {
private static final Object[] EMPTY =
{};
Secret instance = new Secret();
Class secretClass = instance.
getClass();
// Print all the method names & execution result
Method methods
[] = secretClass.
getDeclaredMethods();
System.
out.
println("Access all the methods");
for (int i = 0; i < methods.length; i++) {
System.
out.
println("Method Name: " + methods
[i
].
getName());
System.
out.
println("Return type: " + methods
[i
].
getReturnType());
methods[i].setAccessible(true);
System.
out.
println(methods
[i
].
invoke(instance, EMPTY
) +
"\n");
}
// Print all the field names & values
Field fields
[] = secretClass.
getDeclaredFields();
System.
out.
println("Access all the fields");
for (int i = 0; i < fields.length; i++){
System.
out.
println("Field Name: " + fields
[i
].
getName());
fields[i].setAccessible(true);
System.
out.
println(fields
[i
].
get(instance
) +
"\n");
}
}
public static void main
(String[] args
){
Hacker newHacker = new Hacker();
try {
newHacker.reflect();
}
e.printStackTrace();
}
}
}