是否可以按名称创建类的实例?就像是:
NSString* className = @"Car";
id* p = [Magic createClassByName:className];
[p turnOnEngine];
Run Code Online (Sandbox Code Playgroud)
我不知道这是否可能在objective-c中,但似乎是这样,
我正在尝试使用类似于此的代码扫描程序集以查找实现特定接口的类型:
public List<Type> FindTypesImplementing<T>(string assemblyPath)
{
var matchingTypes = new List<Type>();
var asm = Assembly.LoadFrom(assemblyPath);
foreach (var t in asm.GetTypes())
{
if (typeof(T).IsAssignableFrom(t))
matchingTypes.Add(t);
}
return matchingTypes;
}
Run Code Online (Sandbox Code Playgroud)
我的问题是,在某些情况下,我得到一个ReflectionTypeLoadException调用asm.GetTypes(),例如,如果程序集包含引用当前不可用的程序集的类型.
就我而言,我对导致问题的类型不感兴趣.我正在搜索的类型不需要不可用的程序集.
问题是:是否有可能以某种方式跳过/忽略导致异常但仍处理程序集中包含的其他类型的类型?
在Java中是否可以通过反射访问私有字段str?例如,获取此字段的值.
class Test
{
private String str;
public void setStr(String value)
{
str = value;
}
}
Run Code Online (Sandbox Code Playgroud) 在过去的几年里,我一直认为在Java中,Reflection在单元测试中被广泛使用.由于某些必须检查的变量/方法是私有的,因此必须以某种方式读取它们的值.我一直认为Reflection API也用于此目的.
上周我不得不测试一些软件包,因此编写了一些JUnit测试.像往常一样,我使用Reflection来访问私有字段和方法.但我检查代码的主管对此并不满意,并告诉我,Reflection API并不适合用于此类"黑客攻击".相反,他建议修改生产代码中的可见性.
使用Reflection是不是很糟糕的做法?我真的不相信 -
编辑:我应该提到我需要所有测试都在一个名为test的独立包中(所以使用受保护的visibilty例如也不是一个可能的解决方案)
粗略的时间使用reflect包使用struct字段.特别是,还没弄清楚如何设置字段值.
type t struct { fi int; fs string }
var r t = t{ 123, "jblow" }
var i64 int64 = 456
得到字段的名称我 - 这似乎工作
var field = reflect.TypeOf(r).Field(i).Name
获得字段i的值作为a)接口{},b)int - 这似乎有效
var iface interface{} = reflect.ValueOf(r).Field(i).Interface()
var i int = int(reflect.ValueOf(r).Field(i).Int())
设置字段的值i - 尝试一个 - 恐慌
reflect.ValueOf(r).Field(i).SetInt( i64 )
panic:reflect.Value·SetInt使用未导出字段获得的值
假设它不喜欢字段名称"id"和"name",所以重命名为"Id"和"Name"
a)这个假设是否正确?
b)如果正确,认为没有必要,因为在同一个文件/包中
设置字段i的值 - 尝试两个(字段名称大写) - 恐慌
reflect.ValueOf(r).Field(i).SetInt( 465 )
reflect.ValueOf(r).Field(i).SetInt( i64 )
恐慌:反映.值/ SetInt使用不可寻址的值
@peterSO下面的说明是彻底和高质量的
四.这工作:
reflect.ValueOf(&r).Elem().Field(i).SetInt( i64 )
他还记录了字段名称必须是可导出的(以大写字母开头)
我需要读取Java包中包含的类.这些类在classpath中.我需要直接从Java程序执行此任务.你知道一个简单的方法吗?
List<Class> classes = readClassesFrom("my.package")
Run Code Online (Sandbox Code Playgroud) 我希望检索表中的列列表.该数据库是SQLite的最新版本(3.6,我相信).我正在寻找使用SQL查询执行此操作的代码.与列相关的元数据的额外奖励积分(例如长度,数据类型等)
我有一节课:
class TestClass
def method1
end
def method2
end
def method3
end
end
Run Code Online (Sandbox Code Playgroud)
我怎样才能在这个类的我的方法列表(method1,method2,method3)?
在Java中,private访问修饰符被认为是安全的,因为它在类之外是不可见的.然后外界也不知道那种方法.
但我认为Java反射可以用来打破这个规则.考虑以下案例:
public class ProtectedPrivacy{
private String getInfo(){
return "confidential";
}
}
Run Code Online (Sandbox Code Playgroud)
现在从另一个班级我将获得信息:
public class BreakPrivacy{
public static void main(String[] args) throws Exception {
ProtectedPrivacy protectedPrivacy = new ProtectedPrivacy();
Method method = protectedPrivacy.getClass().getDeclaredMethod("getInfo", null);
method.setAccessible(true);
Object result = method.invoke(protectedPrivacy);
System.out.println(result.toString());
}
}
Run Code Online (Sandbox Code Playgroud)
此时我只是认为私有方法安全,因为做上面的事情我们必须知道方法名称.但是如果包含由其他人编写的私有方法的类我们没有那些可见性.
但是,由于下面的代码行,我的观点变得无效.
Method method[] = new ProtectedPrivacy().getClass().getDeclaredMethods();
Run Code Online (Sandbox Code Playgroud)
现在这method[]包含了上面需要做的所有事情.我的问题是,有没有办法避免使用Java反射这类事情?
我引用Java文档中的一些观点来澄清我的问题.
选择访问级别的提示:
如果其他程序员使用您的类,您希望确保不会发生滥用错误.访问级别可以帮助您执行此操作.使用对特定成员有意义的最严格的访问级别.除非你有充分的理由不使用私人.
reflection ×10
java ×4
.net ×1
go ×1
go-reflect ×1
list ×1
objective-c ×1
plugins ×1
private ×1
ruby ×1
ruby-1.9.2 ×1
scala ×1
sqlite ×1
unit-testing ×1