LINUX.ORG.RU

4kka: .Net reflection vs Java reflection


0

0

http://www.linux.org.ru/profile/eRazor/view-message.jsp?msgid=542692#544060

Итак, насколько я понял, надо сделатъ две вещи, которые как утверждают
отсутствуют в рефлексии дот нета. Первое: добраться до приватного поля
произвольного класса. Второе: вызов приватного метода произвольного
класса.

Ок.

1:

using System;
using System.Reflection;

namespace PrivateField
{
class Foo
{
private string bar = "Godzilla live!";
}

class Application
{
[STAThread]
static void Main(string[] args)
{
Foo foo = new Foo();
System.Reflection.FieldInfo[] fieldInfo;
Type type = typeof(Foo);
fieldInfo = type.GetFields(BindingFlags.NonPublic |
BindingFlags.Instance);
for(int i=0;i<fieldInfo.Length;i++)
{
Console.WriteLine("The value of {0} is: {1}",
fieldInfo[i].Name,fieldInfo[i].GetValue(foo));
}
}
}
}


2:

Регистрацию класса Action и его методов в Executor -е мне лень писать
согласно твоей задачи, тем более она у тебя уже есть, сосредоточимся
непосредственно на том, что ты сказал, что невозможно приватный метод
у класса вызвать.


using System;
using System.Reflection;

namespace PrivateMethod
{
class Executor
{
public static void RunAction()
{
Type type = typeof(Action);
MethodInfo methodInfo =
type.GetMethod("foo",BindingFlags.NonPublic |
BindingFlags.Instance);
Action action = new Action();
methodInfo.Invoke(action,new Object[]{});
}
}

class Action
{
private void foo()
{
Console.WriteLine("Reflection.. he, he, he.");
}
}

class Application
{
[STAThread]
static void Main(string[] args)
{
Executor.RunAction();
}
}
}


Ну и что мы видим? Всё работает, следовательно утверждение об ущербности дот нетовской рефлексии, на основании приведённых примеров ошибочно.

2All: А смогёт кто-нибудь мне пример из Java рефлексии привести, который я под .Net сделать не смогу?

И вопрос: умеет ли Java reflection в run-time байт код создавать?

★★★
Ответ на: комментарий от eRazor

> млять, форматирование слегка побилось..
Да нормально оно читается, я практичесски так и написал сначала, но из-за глюков Managed C++ пришлось от этого отказатся.

kka
()

> И вопрос: умеет ли Java reflection в run-time байт код создавать?
Ну код для EJB как-то генерится, хотя может оно javac вызывает

kka
()

Есть множество библиотек-решений для создания кода "на лету" в Java.

Кстати, EJBC как правило как раз вызывает javac

ARia

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.