我知道我们可以通过反射来访问私有构造函数@Sanjay T. Sharma在他的问题回答中提到:"instanceof Void"总是返回false吗?
你可以使用反射访问私有 - 方法,构造函数,数据成员,一切.
我试图学习反射,我遇到了这个IllegalAccessException.请参阅以下代码:
public class ReflectionTest
{
public static void main(String[] args)
{
Set<String> myStr = new HashSet<String>();
myStr.add("obj1");
Iterator itr = myStr.iterator();
Method mtd = itr.getClass().getMethod("hasNext");
System.out.println(m.invoke(it));
}
}
Run Code Online (Sandbox Code Playgroud)
当我尝试运行此程序时,我得到以下内容:
Exception in thread "main" IllegalAccessException
Run Code Online (Sandbox Code Playgroud)
我不明白发生了什么.有任何想法吗?提前致谢.
我使用JMockit 1.1,我想做的就是调用私有方法并测试返回值.但是,我无法从JMockit De-Encapsulation示例中了解如何执行此操作.
我试图测试的方法是这个类中的私有方法:
public class StringToTransaction {
private List<String> parseTransactionString(final String input) {
// .. processing
return resultList;
}
}
Run Code Online (Sandbox Code Playgroud)
我的测试代码如下.
@Test
public void testParsingForCommas() {
final StringToTransaction tested = new StringToTransaction();
final List<String> expected = new ArrayList<String>();
// Add expected strings list here..
new Expectations() {
{
invoke(tested, "parseTransactionString", "blah blah");
returns(expected);
}
};
}
Run Code Online (Sandbox Code Playgroud)
而我得到的错误是:
java.lang.IllegalStateException:此时缺少对mocked类型的调用; 请确保仅在声明合适的模拟字段或参数后才会出现此类调用
也许我在这里误解了整个API,因为我认为我不想模拟这个类..只是测试调用私有方法的结果.
如果属性名称仅在运行时已知,我如何读取Kotlin数据类实例中的属性值?
有时候,如果我将某些方法的可见性从私有更改为私有,为了便于单元测试模拟,断言,我发现自己处于单元测试会更容易的情况下......
一个例子就是这样
假设我有一个包含4个属性X,Y,Z和R的对象A,其中X,Y和Z是集合,R是每个集合的不同元素之间的关系,例如,关系将由X的元素组成, Y的元素和Z的元素.对象A不允许直接访问X,Y,Z或R,而是提供了一个丰富的API,允许您在X,Y和Z上创建新元素,也允许您将这些元素混合成新的R元素.对于单元测试,使用公共getX(),public getY(),public getZ()和public getR()方法非常方便,因此每次调用时我都可以对对象的内部做出确切的断言.对象API.但是,暴露X,Y和Z是我想要防止的,这就是为什么从非常开始的对象使这些元素变得私有,并且只使用它的API提供对它们的间接访问.然而,提供包私有方法getX(),getY(),getZ()和getR()是否有意义,以便至少形成单元测试我可以轻松检查对象的内部状态是否是预期的?
缺点当然是方法的可见性增加,并且鉴于这种方法是私有的,有充分的理由,感觉有点奇怪.
当然我可以使用反射来达到同样的效果,但感觉更脏.
所以问题是,这是一种好的还是坏的做法?这是代码味吗?它会发生在别人身上吗?这有更好的技术吗?
有没有办法java.net.http.HttpClient立即释放它所持有的资源?
在内部,它包含一个选择器,一个连接池和一个Executor(当使用默认值时).但它没有实现Closeable/ AutoCloseable.
我写了一个自定义的 TableColumn 宽度调整策略。您可以在 github 上的Java 8 / JavaFX 8 下查看其代码。如您所见,在方法distributeSpaceRatio()等地方,取决于TableColumn.impl_setWidth()我们计算后将列的宽度设置为所需的值。
我正在将我的项目迁移到 Java 11/JavaFX 11,并且该方法impl_setWidth()已从公共视图中删除。
还有另一种方法可以告诉表格列设置其宽度吗?我对任何解决方案持开放态度,只要它可靠并将 with 设置为(或接近)请求的值。
以下是我迄今为止尝试过的两个没有奏效的想法:
尝试 1:
这个给出了 NoMethodFoundException:
private void setColumnWidth ( TableColumn column, double targetWidth ) {
try {
Method method = column.getClass().getDeclaredMethod( "setWidth" );
method.setAccessible( true );
Object r = method.invoke( targetWidth );
} catch ( Exception e ) {
e.printStackTrace();
}
}
Run Code Online (Sandbox Code Playgroud)
尝试 2:
这个没有效果:
private void setColumnWidth ( TableColumn column, double targetWidth ) { …Run Code Online (Sandbox Code Playgroud) 我一直在阅读教程控制对类成员的访问.我很困惑使用package-private可能是一个很好的用例.因为据我所知,您可以随时将包声明更改为此类的包声明,并将其视为公共类.我知道这不是一件好事,但是什么阻止了我?
BookView.class有一个私有方法,如下所示
public class BookView{
private boolean importBook(String epubBookPath){
//The function that adds books to database.
}
}
Run Code Online (Sandbox Code Playgroud)
我试图从另一个包中调用此函数.我的代码是
protected void onPostExecute(String file_url) {
// dismiss the dialog after the file was downloaded
dismissDialog(progress_bar_type);
/*Now we add the book information to the sqlite file.*/
TextView textView=(TextView)findViewById(R.id.textView1);
String filename = textView.getText().toString();
String baseDir = Environment.getExternalStorageDirectory().getAbsolutePath();
String epubBookPath = baseDir+filename;
Log.i("epubBookPath:",epubBookPath); //No errors till here!
try {
Method m=BookView.class.getDeclaredMethod("importBook");
m.setAccessible(true);//Abracadabra
//I need help from here! How do i pass the epubBookPath to the …Run Code Online (Sandbox Code Playgroud) java ×9
java-11 ×2
reflection ×2
unit-testing ×2
data-class ×1
javafx ×1
javafx-11 ×1
jmockit ×1
junit ×1
kotlin ×1
private ×1
security ×1
tdd ×1